You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JWT Token生成报错:Expires早于NotBefore且时间偏移问题排查

问题排查与解决

问题根源

错误IDX12401: Expires: 'xxx' must be after NotBefore: 'xxx'以及4小时时间偏移,核心原因是时区不匹配:

  • 你使用了DateTime.Now(本地系统时间)计算Token过期时间,但JWT的SecurityTokenDescriptor默认会将时间转换为UTC(协调世界时)处理。
  • 若你的本地时区为UTC+4,DateTime.Now的08:03转成UTC就是04:03,而Token的NotBefore默认值是当前UTC时间(08:03),导致转换后的Expires(04:23)早于NotBefore(08:03),触发参数异常。

修复方案

将所有时间操作切换为UTC时间,避免时区转换冲突:

修改过期时间计算逻辑

把JwtAuthenticationManager中的过期时间计算代码:

var tokenExpiryTimeStamp = DateTime.Now.AddMinutes(JWT_TOKEN_VALIDITY_MINS);

替换为:

var tokenExpiryTimeStamp = DateTime.UtcNow.AddMinutes(JWT_TOKEN_VALIDITY_MINS);

可选:显式设置NotBefore(推荐配合UTC使用)

如果需要自定义Token生效起始时间,同样使用UTC时间,添加到SecurityTokenDescriptor中:

var securityTokenDescriptor = new SecurityTokenDescriptor
{
    Subject = claimsIdentity,
    Expires= tokenExpiryTimeStamp,
    NotBefore = DateTime.UtcNow, // 显式设置为当前UTC时间
    SigningCredentials= signingCredential
};

修正UserSession的ExpiresIn计算

修改后,ExpiresIn的计算基于UTC时间,结果依然准确:

ExpiresIn = (int)tokenExpiryTimeStamp.Subtract(DateTime.UtcNow).TotalSeconds,

首次生成正常的原因

首次生成时,本地时间与UTC的偏移可能刚好让转换后的Expires仍晚于NotBefore,但随着时间推移,时区转换的矛盾显现,触发报错。

内容的提问来源于stack exchange,提问作者MiguelRojas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:50:45