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

.NET Core中如何检查当前JWT Token是否已过期?

在.NET Core中检查JWT Token是否过期的几种方法

你已经通过string token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");获取到了JWT Token,以下是几种检查其是否过期的实用方法:

方法1:直接解析Token的过期声明(exp)

JWT的exp声明存储了Token的过期时间戳,你可以解析这个值并与当前时间比较:

using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;

// 已获取的token字符串
string token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");

var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(token);

// 获取过期时间声明(兼容ClaimTypes.Expiration和"exp"两种格式)
var expClaim = jwtToken.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Expiration || c.Type == "exp");
if (expClaim != null)
{
    if (DateTimeOffset.TryParse(expClaim.Value, out var expirationTime))
    {
        bool isExpired = expirationTime < DateTimeOffset.UtcNow;
        // 根据isExpired处理业务逻辑
    }
}

注意:这种方式仅解析声明内容,不会验证Token的签名有效性,如果需要确保Token未被篡改,建议使用方法2。

方法2:完整验证Token有效性(含过期检查)

使用JwtSecurityTokenHandler进行全量验证,不仅会检查过期时间,还会验证签名、发行方(Issuer)、受众(Audience)等,是最安全的方式:

using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;

string token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");

// 根据你的实际配置调整验证参数
var validationParameters = new TokenValidationParameters
{
    ValidateIssuer = true,
    ValidIssuer = "你的Token发行方地址",
    ValidateAudience = true,
    ValidAudience = "你的Token受众标识",
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes("你的签名密钥")),
    ValidateLifetime = true, // 启用过期验证
    ClockSkew = TimeSpan.Zero // 关闭时钟偏差容忍,严格验证过期时间
};

var handler = new JwtSecurityTokenHandler();
try
{
    // 验证Token,失败会抛出对应异常
    var claimsPrincipal = handler.ValidateToken(token, validationParameters, out var validatedToken);
    // 验证通过,Token未过期且合法
    bool isExpired = false;
}
catch (SecurityTokenExpiredException)
{
    // Token已过期
    bool isExpired = true;
}
catch (SecurityTokenInvalidSignatureException)
{
    // Token签名无效,可能被篡改
}
catch (Exception)
{
    // 其他验证失败情况(如Issuer/Audience不匹配等)
}

方法3:从已验证的HttpContext.User中读取过期时间

如果你的应用已经通过AddJwtBearer中间件完成了Token验证,那么HttpContext.User中已经包含了可信的用户声明,直接读取即可:

using System.Security.Claims;

// 从当前上下文的用户声明中获取过期时间
var expClaim = _httpContextAccessor.HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Expiration || c.Type == "exp");
if (expClaim != null)
{
    if (DateTimeOffset.TryParse(expClaim.Value, out var expirationTime))
    {
        bool isExpired = expirationTime < DateTimeOffset.UtcNow;
    }
}

注意:此方法仅适用于Token已被中间件验证通过的场景,此时的声明内容是可信的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:15:39