我正在尝试通过.NET Core 2.1中的刷新 token 和JWT实现基于 token 的身份验证。
这就是我实现JWT token 的方式:
Startup.cs
services.AddAuthentication(option =>
{
option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = true;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = Configuration["Jwt:Site"],
ValidIssuer = Configuration["Jwt:Site"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SigningKey"]))
};
options.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Add("Token-Expired", "true");
}
return Task.CompletedTask;
}
};
});
代币生成:
var jwt = new JwtSecurityToken(
issuer: _configuration["Jwt:Site"],
audience: _configuration["Jwt:Site"],
expires: DateTime.UtcNow.AddMinutes(1),
signingCredentials: new SigningCredentials(signinKey, SecurityAlgorithms.HmacSha256)
);
return new TokenReturnViewModel()
{
token = new JwtSecurityTokenHandler().WriteToken(jwt),
expiration = jwt.ValidTo,
currentTime = DateTime.UtcNow
};
我在响应中得到他正确的值。

但是过了一会儿,我在 postman 中设置了相同的 token 进行授权,并且可以正常工作。
如果 token 已过期,它就不会过期。
我正在使用不记名 token 作为身份验证。
我究竟做错了什么?需要方向。
最佳答案
有一个 token 验证参数称为ClockSkew
,它是在验证时间时获取或设置要应用的时钟偏斜的参数。 ClockSkew
的默认值为5分钟。也就是说,如果您尚未设置 token ,则 token 在5分钟内仍然有效。
如果您想在正确的时间使 token 到期;您需要将ClockSkew
设置为零,如下所示,
options.TokenValidationParameters = new TokenValidationParameters()
{
//other settings
ClockSkew = TimeSpan.Zero
};
另一种方法是,创建自定义
AuthorizationFilter
并手动对其进行检查。var principal = ApiTokenHelper.GetPrincipalFromToken(token);
var expClaim = principal.Claims.First(x => x.Type == "exp").Value;
var tokenExpiryTime = Convert.ToDouble(expClaim).UnixTimeStampToDateTime();
if (tokenExpiryTime < DateTime.UtcNow)
{
//return token expried
}
在这里,
GetPrincipalFromToken
是ApiTokenHelper
类的自定义方法,它将返回您在发行 token 时存储的ClaimsPrincipal
值。
关于asp.net-web-api - JWT token 到期时间失败的.net核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55150099/