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

.NET Core API中JwtSecurityToken过期时间差两小时问题咨询

问题原因与解决办法

这问题我之前也碰到过,本质是时区处理的坑,具体原因和解决办法如下:

为什么会差两小时?

你用DateTime.Now获取的是本地时区的当前时间,但JWT标准里的exp(过期时间)声明要求必须使用UTC时间。当你把本地时间传给JwtSecurityToken的Expires参数时,框架会自动将其转换为UTC时间——如果你的本地时区比UTC快2小时(比如UTC+2时区),那转换后的UTC时间就会比你预期的本地时间早2小时,最终导致token的实际过期时间和你预想的差了2小时。

举个例子:

你的本地时间是2018-04-27 14:49:00(UTC+2),对应的UTC时间是2018-04-27 12:49:00。你加60分钟后得到本地时间15:49:00,框架转成UTC就是13:49:00——这就是token里实际的过期时间,比你预期的本地时间早了2小时。

解决办法

只需要把时间计算改成基于UTC时间即可,有两种方式:

方式1:直接使用DateTime.UtcNow(推荐)

直接用UTC时间来计算过期时间,从根源上避免时区转换问题:

var dt = DateTime.UtcNow.AddMinutes(60); // 基于UTC时间计算过期时间
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var claims = new[] {
    new Claim(JwtRegisteredClaimNames.Sub, user.Email),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
    new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName)
};
var token = new JwtSecurityToken(
    // 补充你的Issuer、Audience等配置
    issuer: _config["Tokens:Issuer"],
    audience: _config["Tokens:Audience"],
    claims: claims,
    expires: dt,
    signingCredentials: creds
);

方式2:将本地时间显式转换为UTC时间

如果你坚持用DateTime.Now,记得手动转成UTC时间再传入:

var dt = DateTime.Now.AddMinutes(60).ToUniversalTime(); // 显式转换为UTC时间

额外提醒

JWT的验证逻辑(比如JwtBearer中间件)也是基于UTC时间来判断token是否过期的,所以必须保证exp声明是UTC时间,才能让过期验证逻辑正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:05:45