ASP.NET Core中JWT令牌过期后仍可访问API的问题
JWT令牌过期后仍能访问API的问题排查与修复
问题分析与修复方案
结合你的代码,导致令牌过期后仍可调用API的核心问题及修复步骤如下:
1. 令牌缺失Issuer和Audience声明
你的Program.cs中开启了ValidateIssuer和ValidateAudience验证,但生成令牌的TokenDescriptor未配置这两个属性。当令牌中缺失iss和aud声明时,验证逻辑可能出现异常跳过,导致过期检查失效。
修复代码:
修改生成令牌的逻辑,在TokenDescriptor中补充Issuer和Audience配置:
var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(authClaims), Expires = DateTime.UtcNow.AddMinutes(1), // 新增以下两行,与验证配置保持一致 Issuer = _configuration.GetSection("JWT:ValidIssuer").Value, Audience = _configuration.GetSection("JWT:ValidAudience").Value, SigningCredentials = new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256Signature) };
2. 中间件顺序错误
你的中间件执行顺序为UseAuthentication() → UseAuthorization() → UseCors("CorsPolicy"),正确顺序应为CORS中间件优先于认证、授权中间件,否则可能导致认证逻辑未被正确触发。
修复代码:
调整中间件顺序:
app.UseCors("CorsPolicy"); // 移至认证前 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();
3. 确认令牌生成的正确性
- 确保生成的令牌包含
exp(过期时间)声明:可以用JWT解析工具查看令牌内容,确认exp字段存在且值为当前时间+1分钟的UTC时间戳。 - 确保返回给客户端的是正确的JWT字符串:在调用
GenerateJwt后,需通过JwtSecurityTokenHandler.WriteToken(token)将SecurityToken转换为标准JWT格式:var token = GenerateJwt(apiInfo, input); var tokenString = new JwtSecurityTokenHandler().WriteToken(token); return tokenString; // 返回该字符串给客户端
4. 排查认证日志(可选)
如果修复后问题仍存在,可添加认证事件日志定位问题:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o => { // 原有配置... o.Events = new JwtBearerEvents { OnAuthenticationFailed = context => { Console.WriteLine($"认证失败原因: {context.Exception.Message}"); return Task.CompletedTask; }, OnTokenValidated = context => { Console.WriteLine($"令牌验证通过,过期时间: {context.SecurityToken.ValidTo}"); return Task.CompletedTask; } }; });
通过日志可明确验证过程中是否触发过期检查,以及具体失败原因。
内容的提问来源于stack exchange,提问作者Slow Death
相关产品推荐
相关产品推荐

