Asp.net-Web-Api

JWT令牌過期時間失敗.net核心

  • August 24, 2021

我正在嘗試通過 .NET Core 2.1 中的刷新令牌和 JWT 來實現基於令牌的身份驗證。

這就是我實現 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
       };

我在 Response 中得到了正確的值。

在此處輸入圖像描述

但是一分鐘後,我在 Postman 中設置了相同的授權令牌,它就可以工作了。如果令牌已過期,則不應。

我使用不記名令牌作為身份驗證。

我究竟做錯了什麼?需要方向。

有一個名為 的令牌驗證參數ClockSkew,它獲取或設置在驗證時間時應用的時鐘偏差。預設值為ClockSkew5 分鐘。這意味著如果您沒有設置它,您的令牌將仍然有效長達 5 分鐘。

如果您想在確切的時間使您的令牌過期;您需要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您在發出令牌時儲存的值。

引用自:https://stackoverflow.com/questions/55150099