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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:21:09