【问题标题】:jwt token expiration time (asp.net core)jwt token 过期时间(asp.net core)
【发布时间】:2018-12-22 09:25:25
【问题描述】:

我想延长 JWT 令牌的生命周期,但我不能。

我尝试用谷歌搜索这件事,发现对JwtBearerOptions.TokenValidationParameters.ClockSkew的引用。

我还尝试提供 1 分 20 秒的时间跨度,但应用并未考虑这些更改。

Startup.cs:

services
  .AddAuthentication(options =>
  {
     options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
     options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  })
  .AddJwtBearer(x =>
  {
     x.RequireHttpsMetadata = false;
     x.SaveToken = true;
     x.TokenValidationParameters = new TokenValidationParameters()
     {
        ClockSkew = TimeSpan.FromSeconds(20),
        RequireExpirationTime = true,
        RequireSignedTokens = true,

        ValidateIssuerSigningKey = true,
        ValidateLifetime = true,
        IssuerSigningKey = Configuration.GetSymmetricSecurityKey(),
        ValidAudience = Configuration.GetValidAudience(),
        ValidIssuer = Configuration.GetValidIssuer()
     };
  });

这是Authenticate 操作:

[AllowAnonymous]
[HttpPost]
public async Task<AuthenticateOutput> Authenticate([FromBody] AuthenticateInput input)
{
   string subdomain = Request.GetSubDomain();
   var user = await _userService.Authenticate(input.UserName, input.Password, subdomain);

   if (user == null)
   {
      throw new Exception("Unauthorised");
   }

   var tokenHandler = new JwtSecurityTokenHandler();

   var tokenDescriptor = new SecurityTokenDescriptor
   {
      Issuer = _config.GetValidIssuer(),
      Audience = _config.GetValidAudience(),
      SigningCredentials = new SigningCredentials(_config.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256),
      Subject = new ClaimsIdentity(new[]
      {
          new Claim(ClaimTypes.Name, user.UserName),
          new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
      })
   };

   var token = tokenHandler.CreateToken(tokenDescriptor);
   string tokenString = tokenHandler.WriteToken(token);

   return new AuthenticateOutput() { UserId = user.Id, Token = tokenString };
}

我错过了什么吗?

【问题讨论】:

    标签: angular authentication asp.net-core jwt


    【解决方案1】:

    令牌描述符中未定义到期值。

    var tokenDescriptor = new SecurityTokenDescriptor
    {
       Issuer = _config.GetValidIssuer(),
       Audience = _config.GetValidAudience(),
       SigningCredentials = new SigningCredentials(_config.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256),
       Subject = new ClaimsIdentity(new[]
       {
          new Claim(ClaimTypes.Name, user.UserName),
          new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
       }),
    
       // expiration time here...
       Expiration = _config.GetExpiration() // etc
    };
    

    【讨论】:

      【解决方案2】:

      Bayram 的回答中有一个错字,所以我想我应该发布我的。

      SecurityTokenDescriptor 中不存在属性 Expiration。我是DateTime? Expires

      DateTime expires = input.RememberMe ? DateTime.UtcNow.AddDays(5) : DateTime.UtcNow.AddMinutes(20);
      
      var tokenDescriptor = new SecurityTokenDescriptor
      {
          Expires = expires,
          ...
      

      完美运行!

      【讨论】:

        【解决方案3】:
        var token = new JwtSecurityToken(_config["Jwt:Issuer"], _config["Jwt:Issuer"],  
         claims, expires: DateTime.Now.AddMinutes(120) 
        

        【讨论】:

          猜你喜欢
          • 2018-11-19
          • 2018-05-02
          • 2023-03-19
          • 2017-11-02
          • 1970-01-01
          • 2022-09-27
          • 2020-08-29
          • 2019-10-18
          • 2018-11-06
          相关资源
          最近更新 更多