gpt4 book ai didi

asp.net-web-api - JWT token 过期时间失败 .net core

转载 作者:行者123 更新时间:2023-12-03 00:34:57 24 4
gpt4 key购买 nike

我正在尝试通过 .NET Core 2.1 中的刷新 token 和 JWT 来实现基于 token 的身份验证。

这就是我实现 JWT token 的方式:

启动.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;
}
};
});

token 生成:

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
};

我在响应中得到了正确的值。

enter image description here

但一分钟后,我在 Postman 中设置了相同的授权 token ,并且它起作用了。如果 token 已过期,则不应过期。

我使用不记名 token 作为身份验证。

我做错了什么?需要指导。

最佳答案

有一个名为ClockSkew的 token 验证参数,它获取或设置验证时间时要应用的时钟偏差。 ClockSkew 的默认值为 5 分钟。这意味着,如果您尚未设置,您的 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 expired
}

此处,GetPrincipalFromTokenApiTokenHelper 类的自定义方法,它将返回您在发出时存储的 ClaimsPrincipal 值一个 token 。

关于asp.net-web-api - JWT token 过期时间失败 .net core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55150099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com