.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
相关产品推荐
相关产品推荐

