如何解决TokenLifetimeInMinutes为负值引发的IDX10104令牌错误?
解决TokenLifetimeInMinutes负值导致的2FA令牌过期问题
问题核心原因
触发IDX10104错误的关键问题有两个:
- 配置项命名与实际单位完全混淆:配置键名是
TokenLifetimeInMinutes,但存储的却是秒数(189180000秒),后续逻辑未做单位转换; - 会话过期时间逻辑完全写反:用
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
相关产品推荐
相关产品推荐

