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

ASP.NET Core极简API中JwtSecurityToken升级为JsonWebToken后认证失败

ASP.NET Core 6 极简API升级JsonWebToken后认证失败解决方案

问题根源

升级后认证失败的核心原因是认证配置与令牌生成逻辑未同步适配新库,即便生成的令牌结构合法,中间件仍可能用旧逻辑验证,或参数不匹配。

分步解决

1. 清理依赖并确认包版本

卸载旧的System.IdentityModel.Tokens.Jwt包,安装最新版的Microsoft.IdentityModel.JsonWebTokens和Microsoft.AspNetCore.Authentication.JwtBearer,避免版本冲突。

2. 重构令牌生成代码

替换旧的JwtSecurityToken和JwtSecurityTokenHandler为JsonWebToken和JsonWebTokenHandler,示例代码:

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

// 从配置读取密钥、发行方、受众
var jwtSettings = builder.Configuration.GetSection("Jwt");
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Key"]));
var signingCreds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

// 构建令牌描述符
var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier, "user123"),
        new Claim(ClaimTypes.Role, "editor")
    }),
    Expires = DateTime.UtcNow.AddMinutes(30),
    SigningCredentials = signingCreds,
    Issuer = jwtSettings["Issuer"],
    Audience = jwtSettings["Audience"]
};

// 生成并输出令牌
var tokenHandler = new JsonWebTokenHandler();
var jsonWebToken = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(jsonWebToken);

3. 更新认证中间件配置

必须让JWTBearer中间件使用JsonWebTokenHandler处理验证,修改Program.cs中的认证服务配置:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        var jwtSettings = builder.Configuration.GetSection("Jwt");
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = jwtSettings["Issuer"],
            ValidAudience = jwtSettings["Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings["Key"])),
            // 强制指定使用新的处理器
            TokenHandler = new JsonWebTokenHandler()
        };

        // 可选:开启详细错误便于调试
        options.Events = new JwtBearerEvents
        {
            OnAuthenticationFailed = context =>
            {
                Console.WriteLine($"认证失败:{context.Exception.Message}");
                return Task.CompletedTask;
            }
        };
    });

// 别忘了添加授权服务
builder.Services.AddAuthorization();

4. 验证参数一致性

  • 生成令牌和验证时的Issuer、Audience、签名密钥必须完全一致,大小写也不能错
  • 检查令牌过期时间是否在当前时间范围内
  • 确认Claims的类型(比如ClaimTypes.Name vs name)在生成和验证端统一

5. 调试技巧

  • 启用日志调试级别,查看认证过程中的详细错误:
builder.Logging.AddConsole();
builder.Logging.SetMinimumLevel(LogLevel.Debug);
  • 用JWT解析工具查看令牌内容,确认签名算法、Claims、有效期等是否符合预期

避坑提示

  • 不要混合引用新旧JWT库,否则容易出现类型冲突
  • JsonWebTokenHandler.CreateToken()返回的是JsonWebToken实例,不要传入旧的JwtSecurityToken给WriteToken()方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:07:31