asp.net-web-api - JWT token 到期时间失败的.net核心

标签 asp.net-web-api .net-core jwt access-token refresh-token

我正在尝试通过.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
        };

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

enter image description here

但是过了一会儿,我在 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
} 

在这里,GetPrincipalFromTokenApiTokenHelper类的自定义方法,它将返回您在发行 token 时存储的ClaimsPrincipal值。

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

相关文章:

azure - 在 Azure 上托管的 asp.net 中存储将为环境变量引用的 JSON 文件的位置

asp.net-mvc-4 - ASP.NET Web API-在一个 Controller 上有多种POST方法?

serial-port - 如何在 .NET Core 2.0 中访问 errno?

java - 在 Spring Boot2 中验证 Oauth2 JWT token

c# - Web API OData V4 开放类型 - 如何配置 Controller 和数据上下文

c# - .NET Standard 2.0项目中为什么可以添加.NET framework项目作为引用?

c# - 在 pythonnet 中导入 .NET 自定义类时出现 ModuleNotFoundError

node.js - jwt 访问 token 和刷新 token 流

node.js - 使用JWT token 。有没有更好的方法?

c# - Web API - 405 - 请求的资源不支持 http 方法 'PUT'