当前位置: 首页 > 知识库问答 >
问题:

JWT令牌到期时间失败。net核心[重复]

罗安宁
2023-03-14

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

这就是我实施JWT令牌的方式:

启动.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 中为授权设置了相同的令牌,它可以工作。如果令牌已过期,则不应过期。

我使用不记名令牌作为认证。

我做错了什么?需要方向。

共有1个答案

上官鸿朗
2023-03-14

有一个名为 ClockSkew 的令牌验证参数,它获取或设置验证时间时要应用的时钟偏差。时钟倾斜的默认值为 5 分钟。这意味着如果您尚未设置它,您的令牌将最多有效 5 分钟。

如果您想在确切的时间过期令牌;您需要将ClockSkew设置为零,如下所示,

options.TokenValidationParameters = new TokenValidationParameters()
{
    //other settings
    ClockSkew = TimeSpan.Zero
};

另一种方法是,创建自定义授权过滤器并手动检查它。

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
} 

这里,< code > GetPrincipalFromToken 是< code>ApiTokenHelper类的自定义方法,它将返回您在颁发令牌时存储的< code>ClaimsPrincipal值。

 类似资料:
  • 我有两台服务器使用相同的ASP。NET核心标识后端。我使用以下命令生成密码重置令牌: 我通过电子邮件链接发送此令牌。当用户单击链接时,他们会被带到一个单独的站点,该站点应提供一个用户界面来更改密码。以下代码处理用户提交令牌及其新密码的密码: 在第二台服务器上,标识结果总是返回false,因为“无效令牌”。 通过查看源代码,我看到令牌是使用IP地址生成的(因此我理解令牌验证失败的原因)。 我的问题是

  • 我有一个使用. net core 2.0构建的Web API和一个使用xamarin构建的移动应用程序。要登录移动应用程序,请通过传递(用户名和密码)调用Web API。如果凭据有效,Web Api会提供一个JWT令牌。移动应用程序有一个功能,即使您关闭应用程序,也可以让用户保持登录状态,例如(facebook、Instagram等…)。 问题是: 如何在用户登录应用程序之前保持JWT令牌有效,而

  • 我正在使用以下示例来玩Spring Cloud OAuth2实现: https://github.com/spring-cloud-samples/authserver https://github.com/spring-cloud-samples/sso 第一个是OAuth服务器,它在对用户进行身份验证时生成JWT令牌。第二个是正在被消耗的资源。根据OAuth规范,资源将用户的身份验证转发给au

  • 我将Django JWT与DRF一起使用,将Vue Js与Axios一起使用。当用户登录时,我检索并将令牌存储在本地存储器中,我已验证该令牌可以正常工作。然后我重定向到一个新页面,在那里我提出另一个请求以获取数据。每次我重定向到这个页面,我得到一个401未授权,当我刷新页面,它工作良好。在发出第二个请求之前,我检查了是否存储了令牌。我尝试在创建的钩子中获取重定向页面上的数据。我还创建了一个axio

  • 经过很多挣扎(以及大量的指导,指南等),我设法设置了一个小型的.NET Core REST Web API,当存储的用户名和密码有效时,使用身份验证控制器颁发JWT令牌。 令牌将用户ID存储为子声明。 我还设法设置了Web API,以便在方法使用Authorize注释时验证这些标记。 现在我的问题是:我如何在我的控制器(在一个Web API中)中读取用户id(存储在主题声明中)? 这基本上是这个问

  • 我已经创建了自定义中间件类来验证JWT令牌。我在