ASP.NET Core 5中JWT Bearer令牌验证报IDX10223过期问题求助
解决方案
核心问题排查与修复方法
1. 确认令牌本身的时间参数正确
首先验证生成的JWT本身的时间配置是否符合预期:
- 手动解析JWT的Payload部分,查看
nbf(生效时间)和exp(过期时间)的时间戳,转换为UTC时间后确认当前UTC时间处于两个时间的区间内。 - 检查配置文件中
Jwt:MinutosExpiracionTokenAcceso的配置值是否为正整数,避免读取到0、负数或者非预期的数值导致过期时间早于当前时间。 - 生成令牌时必须使用UTC时间,不要使用
DateTime.Now生成本地时间,避免时区转换导致的时间参数错误,同时打印fechaHoy(生效时间)和fechaExpiracionToken(过期时间)的UTC值,确认时间计算逻辑没有问题。
2. 修复自定义生命周期验证器
你当前编写的自定义LifetimeValidator只校验了过期时间,没有处理notBefore(生效时间)参数,若当前时间早于生效时间也会返回验证失败,修改验证逻辑如下:
LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters ) => { var utcNow = DateTime.UtcNow; // 校验生效时间:当前时间不能早于令牌生效时间 if (notBefore.HasValue && utcNow < notBefore.Value.ToUniversalTime()) { return false; } // 校验过期时间:当前时间不能晚于令牌过期时间 if (expires.HasValue && utcNow > expires.Value.ToUniversalTime()) { return false; } return true; }
另外错误信息中ValidTo和Current time显示为System.DateTime属于System.IdentityModel.Tokens.Jwt特定版本的日志格式化问题,不影响实际验证逻辑,不需要额外处理。
3. 保证验证参数一致性
手动调用ValidateToken方法时使用的_tokenValidationParameters不要手动实例化,建议直接从依赖注入容器中获取全局配置的实例,避免两处配置不一致:
// 在需要验证令牌的服务类构造函数中注入 public YourService(IOptions<JwtBearerOptions> jwtOptions) { _tokenValidationParameters = jwtOptions.Value.TokenValidationParameters; }
4. 排查时间差问题
如果是跨机器部署或者系统时间存在偏差,可以先调整ClockSkew参数允许一定时间误差,排查是否是时间同步问题导致的验证失败:
// 调整为允许5分钟的时间误差,验证通过后再根据实际场景调整 ClockSkew = TimeSpan.FromMinutes(5)
内容的提问来源于stack exchange,提问作者Aldemar Cuartas Carvajal
相关产品推荐
相关产品推荐

