.NET 7升级至.NET 8后JWT令牌数据库校验代码失效求助
解决.NET 8升级后JWT令牌数据库校验失效问题
问题原因
.NET 8中ASP.NET Core的JWT认证模块默认切换到了性能更优的JsonWebToken解析逻辑(基于System.Text.Json),不再将context.SecurityToken实例化为旧的JwtSecurityToken类型。这就导致你原来的类型转换判断!(context.SecurityToken is JwtSecurityToken accessToken)直接返回true,触发context.Fail逻辑。
修复方案
方案1:适配新的JsonWebToken类型
直接修改代码,使用JsonWebToken替代JwtSecurityToken,并注意其原始令牌属性为RawValue(而非旧的RawData):
if (!(context.SecurityToken is JsonWebToken accessToken) || string.IsNullOrWhiteSpace(accessToken.RawValue) || !await tokenStoreService.IsValidTokenAsync(accessToken.RawValue, userId)) { context.Fail("This token is not in our database."); return; }
方案2:兼容.NET 7和.NET 8版本
如果需要保留跨版本兼容性,可以同时处理两种令牌类型:
string rawToken = null; if (context.SecurityToken is JwtSecurityToken jwtToken) { rawToken = jwtToken.RawData; } else if (context.SecurityToken is JsonWebToken jsonToken) { rawToken = jsonToken.RawValue; } if (string.IsNullOrWhiteSpace(rawToken) || !await tokenStoreService.IsValidTokenAsync(rawToken, userId)) { context.Fail("This token is not in our database."); return; }
方案3:强制回退到旧逻辑(不推荐)
如果暂时不想修改代码,可以在JWT认证配置中关闭新的映射逻辑,强制使用JwtSecurityToken:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { // 你的其他JWT配置(如Audience、Issuer、SigningKey等) options.MapInboundClaims = false; });
注意:此方案仅作为临时过渡使用,新的
JsonWebToken解析器在性能上有明显优势,建议优先适配新类型。
内容的提问来源于stack exchange,提问作者Milad Ahmadi
相关产品推荐
相关产品推荐

