【问题标题】:JWT token expiration not working in Asp.Net Core API?JWT 令牌过期在 Asp.Net Core API 中不起作用?
【发布时间】:2020-05-20 09:24:08
【问题描述】:

我已将令牌到期时间设置为 1 分钟,但 1 分钟后我没有收到 401 未授权错误。

Startup.cs

.AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,
                        ValidateAudience = true,
                        ValidateLifetime = true,
                        ValidateIssuerSigningKey = true,
                        ValidIssuer = Configuration["Jwt:Issuer"],
                        ValidAudience = Configuration["Jwt:Issuer"],
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
                    };
                });

令牌生成方法:

var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
int expiryMins = 1
var token = new JwtSecurityToken(_configuration["Jwt:Issuer"],
  _configuration["Jwt:Issuer"],
  null,
  expires: DateTime.UtcNow.AddMinutes(expiryMins),
  signingCredentials: credentials);

return new JwtSecurityTokenHandler().WriteToken(token);

【问题讨论】:

  • 它是否使用令牌?如果令牌未在标头中发送,它会 401 吗?
  • 默认情况下,身份验证处理程序允许一些时钟偏差来说明服务器上的时钟不同。 IIRC 是 5 分钟,可以在 TokenValidationParameters 中调整。
  • @possum 是的,它使用令牌,
  • 表示这一行ClockSkew = TimeSpan.FromMinutes(0),
  • ClockSkew 表示如果设置为 5 分钟,则令牌将在过期后 5 分钟工作。保持这种状态通常是个好主意,因为服务器时间可能不同。

标签: c# asp.net-core jwt asp.net-core-3.1 jwt-auth


【解决方案1】:

正如我们在 cmets 中所讨论的,这是由于时钟偏差设置默认为 5 分钟,允许令牌在过期后最多 5 分钟内被视为有效(从验证令牌的服务器的角度来看)。 存在时钟偏差设置是因为颁发令牌的服务器和验证令牌的服务器的时钟可能略有不同。 通常在这里有一些灵活性是个好主意,默认的 5 分钟是可以的。 如果您不希望有这种行为,可以将 TokenValidationParameters 上的 ClockSkew 设置为 0 秒。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2021-07-23
    • 2020-08-17
    • 2019-08-03
    • 2018-12-23
    • 2017-08-20
    • 2020-05-14
    • 2016-09-25
    • 2020-08-22
    相关资源
    最近更新 更多