Asp.net-Web-Api
JWT令牌過期時間失敗.net核心
我正在嘗試通過 .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 }這裡,
GetPrincipalFromToken是ApiTokenHelper該類的自定義方法,它將返回ClaimsPrincipal您在發出令牌時儲存的值。
