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

如何解决TokenLifetimeInMinutes为负值引发的IDX10104令牌错误?

解决TokenLifetimeInMinutes负值导致的2FA令牌过期问题

问题核心原因

触发IDX10104错误的关键问题有两个:

  1. 配置项命名与实际单位完全混淆:配置键名是TokenLifetimeInMinutes,但存储的却是秒数(189180000秒),后续逻辑未做单位转换;
  2. 会话过期时间逻辑完全写反:用AddSeconds(-webExpirationTimeSettings.Time)把会话过期时间往当前时间之前调整,导致expiration早于DateTime.UtcNow,相减后得到负的时间差,最终TokenLifetimeInMinutes为负数。

具体修复步骤

1. 修正配置项命名(从根源避免混淆)

把配置键名改成符合实际单位的名称,避免后续维护误解:

"TokenLifetimeInSeconds": {
  "Time": 189180000
}

同步调整WebExpirationTimeSettings的注入配置,对应这个新键名。

2. 修复会话过期时间的计算逻辑

把时间调整的减号改为加号,让会话过期时间基于基础时间向后延长,而不是提前:

// 原错误代码:response.Data.SessionExpirationDate = response.Data.SessionExpirationDate.Value.AddSeconds(-webExpirationTimeSettings.Time);
// 修正后:
response.Data.SessionExpirationDate = response.Data.SessionExpirationDate.Value.AddSeconds(webExpirationTimeSettings.Time);

3. 增加取值校验,兜底避免负值

即使前面的逻辑修复,也要确保最终传入TokenLifetimeInMinutes的值大于0,增加兜底判断:

var expiration = response.Data.SessionExpirationDate.Value.ToUniversalTime();
var timeUntilExpiration = expiration.Subtract(DateTime.UtcNow);

// 计算有效时长,若为负则设为默认有效时长(比如5分钟)
var validLifetimeMinutes = timeUntilExpiration.TotalMinutes > 0 
    ? (int)timeUntilExpiration.TotalMinutes + 1 
    : 5;

var tokenHandler = new JwtSecurityTokenHandler
{
    TokenLifetimeInMinutes = validLifetimeMinutes
};

可选:保留原配置键名的兼容方案

如果必须保留TokenLifetimeInMinutes这个键名,需要在代码中做单位转换,把配置的秒数转为分钟后再使用:

// 把配置的秒数转换为分钟
var lifetimeMinutes = webExpirationTimeSettings.Time / 60;
// 用转换后的分钟数设置会话过期时间
response.Data.SessionExpirationDate = response.Data.SessionExpirationDate.Value.AddMinutes(lifetimeMinutes);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:50:18