【问题标题】:Refresh JWT expiration without refreshing or generating a new Token刷新 JWT 过期而不刷新或生成新 Token
【发布时间】:2021-04-06 23:19:34
【问题描述】:

我有一个 Angular/.NET Core 应用程序,
我只想刷新令牌的到期时间(例如添加 1 小时),而不刷新和生成新令牌。
我可以点它还是我需要生成一个新的令牌?

这是我在对应用进行身份验证时首先生成令牌的方式:

  var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(new[]
                {
                new Claim(ClaimTypes.Name, loginModel.UserName),
                new Claim(ClaimTypes.Rsa, company.Name),
                new Claim(ClaimTypes.PrimarySid, company.Id.ToString()),
                new Claim(ClaimTypes.NameIdentifier, ap.Language),
                new Claim(ClaimTypes.IsPersistent, loginModel.RememberMe.ToString()),
                new Claim(ClaimTypes.Expiration, loginModel.RememberMe ? DateTime.Now.AddHours(1).ToString() : DateTime.Now.AddHours(1).ToString()),
                new Claim(ClaimTypes.Actor, employeeIdentifier)
            }),
            };
            foreach (string r in Role)
            {
                tokenDescriptor.Subject.AddClaims(new[] { new Claim(ClaimTypes.Role, r) });
            }
            var token =
                new JwtSecurityToken(issuer: _configuration["Token:Issuer"],
                                    audience: _configuration["Token:Audience"],
                                    claims: tokenDescriptor.Subject.Claims,
                                    expires: loginModel.RememberMe ? DateTime.Now.AddHours(1) : DateTime.Now.AddHours(1),
                                    notBefore: DateTime.Now,
                                    signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Token:Key"])),
                                    SecurityAlgorithms.HmacSha512));

            string tokenstring = new JwtSecurityTokenHandler().WriteToken(token);
            try
            {
                JwtKeys key = new JwtKeys()
                {
                    jwtKey = tokenstring,
                    userId = ap.UserName
                };
                _db.Entry(key).State = EntityState.Added;
                _db.SaveChanges();
            }

有什么帮助吗?谢谢

【问题讨论】:

  • 更改令牌中的任何内容实际上意味着创建一个新令牌。令牌已签名,负载的任何更改都会使签名无效,因此需要再次签名,因此最好的方法是使用刷新令牌。
  • @jps 谢谢,你能给我任何简单的实现刷新令牌的例子吗?

标签: angular asp.net-core jwt


【解决方案1】:

令牌生成后,不能以任何方式更改。您必须生成一个新令牌才能刷新它。

更好的方法是.net core发送一个token和过期时间(计算具体时间,比如10:00加一小时,改成11:00)到angular。

当用户在 10:55 到 11:00 之间访问应用程序时,客户端无需重新登录即可发送刷新请求。当时间超过 11:00 时,用户需要重新登录。

这是一个例子。同时生成截止日期。

public IActionResult Authenticate(string username,string userpassword,string email)
    {
        var user = new Users
        {
            //...
        };
        
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes("this is a public key");
        var authTime = DateTime.Now;
        var expiresAt = authTime.AddDays(7);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(JwtClaimTypes.Audience,"api"),
                //...
            }),
            Expires = expiresAt,
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        var tokenString = tokenHandler.WriteToken(token);

        return Ok(new
        {
            access_token = tokenString,
            expiresTime=DateTime.Now.AddHours(1)
        });
    }

将json存入LocalStorage,请求时判断是否临近过期时间。

在 angualr 中,使最后期限减去五分钟。

 var deadline = (new Date(localStorage.getItem(''))).getTime();
if (deadline > (Date.now() - 60 * 60 * 1000)) {
    //refresh token
}

【讨论】:

  • 是的,我希望在用户仍处于活动状态时刷新令牌或将到期时间延长 1 小时。您有任何示例如何执行此操作吗?谢谢
猜你喜欢
  • 2021-04-26
  • 1970-01-01
  • 2019-05-09
  • 2019-07-04
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2018-07-22
相关资源
最近更新 更多