Asp.Net Core Identity验证JWT有效性的依据及JWT安全提升方法
ASP.NET Core JWT 有效性验证规则与安全优化方案
一、ASP.NET Core 默认JWT有效性校验规则
你当前的配置下,JWT验证会按优先级依次执行以下校验,全部通过才会判定令牌有效:
- 签名有效性校验:这是最核心的校验环节,系统会用你配置的
IssuerSigningKey对JWT的头部和载荷重新计算签名,和令牌自带的签名对比,只要令牌内容被篡改、或者没有用正确的密钥签名,这一步就会直接校验失败,这也是你提到的核心安全屏障,攻击者没有密钥的前提下,哪怕知道iss、aud、exp的所有值,也无法生成合法的令牌。 - 有效期校验:校验
exp(过期时间)、nbf(生效时间,未手动配置时默认取令牌生成时间)是否在合法时间范围内,你开启了默认的生命周期校验,所以过期令牌会直接被拦截。 - 签发者校验:你配置了
ValidateIssuer=true,系统会校验令牌的iss字段是否和你配置的ValidIssuer完全一致。 - 受众校验:你配置了
ValidateAudience=true,系统会校验令牌的aud字段是否和你配置的ValidAudience完全一致。
你测试时删除其他声明仍能通过验证的原因是:默认配置下,系统没有强制要求令牌必须携带业务层面的声明(比如用户名、角色、JTI等),只要上述四项校验通过就会判定令牌合法。
二、提升JWT API防护能力的措施
你可以通过以下优化进一步提升安全性:
基础配置优化
- 提升密钥安全强度:JWT签名密钥长度至少要达到16位以上,生产环境建议使用32位及以上的无规律随机字符串,不要硬编码在代码里,存储到环境变量、云密钥管理服务等安全位置,禁止提交到代码仓库。
- 强制HTTPS传输:生产环境将
RequireHttpsMetadata设为true,避免令牌在HTTP明文传输过程中被窃听。 - 缩短令牌有效期:将默认3小时的有效期调整为15~30分钟,搭配刷新令牌(Refresh Token)实现无感续期,就算令牌泄露,可被利用的时间窗口也会大幅缩小。
- 增加必填声明校验:在
TokenValidationParameters中新增配置,要求令牌必须携带业务必要的声明,示例配置如下:
options.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true, ValidateAudience = true, ValidAudience = Configuration["JWT:ValidAudience"], ValidIssuer = Configuration["JWT:ValidIssuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"])), // 新增基础校验规则 RequireSignedTokens = true, RequireExpirationTime = true, ValidateLifetime = true, // 配置身份、角色声明的对应字段 NameClaimType = ClaimTypes.Name, RoleClaimType = ClaimTypes.Role, // 自定义校验逻辑,确保用户声明存在 AudienceValidator = (audiences, token, validationParameters) => { var jwtToken = token as JwtSecurityToken; // 校验必须存在用户名字段 if (jwtToken == null || !jwtToken.Claims.Any(c => c.Type == ClaimTypes.Name)) { return false; } return audiences.Contains(validationParameters.ValidAudience); } };
额外校验逻辑补充
- 实现令牌黑名单机制:你生成令牌时已经加入了唯一标识
Jti,可以将Jti和用户的绑定关系存入缓存(如Redis),用户登出、修改密码、权限变更时,将对应的Jti加入黑名单,每次校验令牌时先查询黑名单,存在则直接判定令牌无效,解决JWT默认无法主动作废的问题。 - 增加用户状态校验:每次校验令牌时,同步查询用户账号状态,如果账号已被禁用、注销,直接拒绝访问,避免账号回收后未过期的令牌仍能使用的风险。
其他安全规范
- 不要在JWT载荷中存储敏感信息:JWT的载荷仅做Base64编码,任何人拿到令牌都可以直接解码,禁止存储密码、身份证号、手机号等敏感信息。
- 优先使用更安全的签名算法:如果服务拆分、多系统校验令牌的场景,建议切换为非对称签名算法(如RS256),用私钥签名、公钥验签,避免密钥扩散泄露的风险。
- 前端做好令牌存储防护:不要将JWT存储在
localStorage中,容易被XSS攻击窃取,优先存储在带HttpOnly、Secure属性的Cookie中,降低泄露风险。
内容的提问来源于stack exchange,提问作者Benjamin Larsen
相关产品推荐
相关产品推荐

