配置14天有效期的JWT token为何1小时左右就失效需刷新?
解决方案
你遇到的1小时失效问题,90%以上的场景是以下两个配置遗漏导致的,按顺序排查修改即可:
1. 修正ApplicationOAuthProvider中的Ticket有效期配置
你在OAuthOptions中配置的AccessTokenExpireTimeSpan不会自动生效,需要在自定义的ApplicationOAuthProvider的GrantResourceOwnerCredentials方法中,手动为生成的身份验证Ticket指定过期时间,默认未配置的话就是1小时有效期:
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { // 原有用户名密码校验逻辑保留 var user = await UserManager.FindAsync(context.UserName, context.Password); if (user == null) { context.SetError("invalid_grant", "用户名或密码错误"); return; } var identity = new ClaimsIdentity(context.Options.AuthenticationType); identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); // 其他自定义Claim添加逻辑保留 // 新增以下配置:绑定OAuthOptions中设置的有效期 var authProps = new AuthenticationProperties { IssuedUtc = DateTimeOffset.UtcNow, // 直接使用你在OAuthOptions中配置的过期时长,后续改这里的配置即可统一生效 ExpiresUtc = DateTimeOffset.UtcNow.Add(context.Options.AccessTokenExpireTimeSpan) }; var ticket = new AuthenticationTicket(identity, authProps); context.Validated(ticket); }
修改完成后可以生成token后到JWT解析工具查看payload中的exp字段,确认过期时间是否符合预期。
2. 配置固定的机器密钥避免签名校验失败
如果token的exp字段是正确的14天/7天后的时间戳,但还是1小时左右失效,那是IIS默认的机器密钥自动生成机制导致的:默认配置下ASP.NET会在应用池回收、站点重启时自动生成新的机器密钥,而JWT的签名校验依赖该密钥,密钥变更后之前签发的所有token都会校验失败返回401。
在web.config的system.web节点下添加固定机器密钥配置即可解决:
<system.web> <machineKey validationKey="自行生成的64位十六进制字符串" decryptionKey="自行生成的32位十六进制字符串" validation="SHA256" decryption="AES" /> </system.web>
提示:机器密钥可以通过IIS管理器的「机器密钥」功能自动生成,也可以用随机十六进制生成工具生成,生产环境注意保密密钥不要泄露。
3. 调整为7天有效期
完成上述两步配置后,只需要修改OAuthOptions中的AccessTokenExpireTimeSpan为TimeSpan.FromDays(7)即可实现7天有效期的需求:
AccessTokenExpireTimeSpan = TimeSpan.FromDays(7),
内容的提问来源于stack exchange,提问作者Slawek
相关产品推荐
相关产品推荐

