JWT 令牌过期在 Asp.Net Core API 中不起作用?
JWT token expiration not working in Asp.Net Core API?
我已将令牌过期时间设置为 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);
正如我们在评论中讨论的那样,这是由于时钟偏差设置默认为 5 分钟,允许令牌在过期后最多 5 分钟被视为有效(从验证令牌的服务器的角度来看)。
存在时钟偏差设置是因为颁发令牌的服务器和验证令牌的服务器的时钟可能略有不同。
通常在这里有一些灵活性是个好主意,默认的 5 分钟就可以了。
如果您不希望出现这种行为,可以将 TokenValidationParameters 上的 ClockSkew 设置为 0 秒。
我已将令牌过期时间设置为 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);
正如我们在评论中讨论的那样,这是由于时钟偏差设置默认为 5 分钟,允许令牌在过期后最多 5 分钟被视为有效(从验证令牌的服务器的角度来看)。 存在时钟偏差设置是因为颁发令牌的服务器和验证令牌的服务器的时钟可能略有不同。 通常在这里有一些灵活性是个好主意,默认的 5 分钟就可以了。 如果您不希望出现这种行为,可以将 TokenValidationParameters 上的 ClockSkew 设置为 0 秒。