ASP.NET Core 6:JWT登录用户30分钟自动登出,需延长至6小时
ASP.NET Core 6外部JWT认证用户30分钟强制登出问题排查与解决
核心问题定位
你的问题根源大概率在JWT Token自身的过期声明(exp),而非ASP.NET Core的Cookie配置——外部JWT认证依赖Token自带的有效期规则,而你之前调整的Application Cookie配置仅对内置Cookie认证生效,对JWT认证流程无影响。
1. 验证JWT Token的exp声明
使用JWT解析工具(如jwt.io)解析用户登录后获取的Token,查看exp字段对应的时间:
- 如果
exp对应登录后30分钟,说明问题出在颁发Token的外部认证服务,需将Token过期时间调整为6小时。 - 只有Token本身的有效期设为6小时,后续的辅助配置才有意义。
2. 确认JWT认证配置正确性
检查Program.cs中AddJwtBearer的配置,确保没有错误限制Token有效期:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateLifetime = true, // 默认开启,会严格验证Token的exp声明 ClockSkew = TimeSpan.Zero, // 可选,关闭默认5分钟的时钟偏差容忍 // 其他必填配置:ValidIssuer、ValidAudience、IssuerSigningKey等 }; });
注意:不要将ValidateLifetime设为false来跳过过期验证,这会带来安全风险。
3. Cookie承载JWT的辅助配置(若适用)
如果你将JWT存储在Cookie中(而非请求头),需确保Cookie过期时间大于等于JWT的有效期,避免Cookie提前过期导致无法读取Token:
builder.Services.ConfigureApplicationCookie(options => { options.ExpireTimeSpan = TimeSpan.FromHours(6); options.SlidingExpiration = true; });
此配置仅为辅助,核心仍需保证JWT自身的exp声明为6小时。
无效操作的原因说明
你之前尝试的以下操作对JWT认证无效:
- Application Cookie配置:仅针对内置Cookie认证(如Identity登录)生效,JWT认证不依赖此规则。
- AuthenticationProperties持久化:这是Cookie认证用于服务器端保存登录状态的参数,JWT是无状态令牌,不需要持久化。
- 数据保护配置:仅用于Cookie加密,不影响JWT的过期逻辑。
- IIS空闲超时:内置登录用户无异常,说明应用池未提前回收,排除此因素。
解决方案
- 修改外部认证服务的Token过期时间:联系JWT颁发方,将Token的
exp声明设置为登录后6小时。 - 自行生成JWT时的调整:如果是你方服务生成JWT,需在生成逻辑中明确设置有效期:
var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Expires = DateTime.UtcNow.AddHours(6), // 关键:设置为6小时有效期 SigningCredentials = new SigningCredentials(/* 你的签名密钥对象 */) }; var token = new JwtSecurityTokenHandler().CreateToken(tokenDescriptor);
内容的提问来源于stack exchange,提问作者N.MORR
相关产品推荐
相关产品推荐

