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

ASP.NET Identity JWT授权异常:获取Token后访问接口返回401

ASP.NET Core JWT授权401错误排查方案

问题概述

  • 登录流程正常,能获取预期JWT Token
  • 携带Token访问带[Authorize]特性的/api/Blogs端点时,返回401 Unauthorized
  • Postman响应头显示Bearer error="invalid_token"
  • Swagger、Postman按规范设置Bearer Token后均无效

排查修复步骤

1. 核对JWT配置一致性

检查appsettings.json中的JWT配置项(AccessTokenKey、Issuer、Audience),确保与代码中读取的内容完全一致(包括大小写、空格、特殊字符):

  • 重点:AccessTokenKey长度需满足HmacSha256算法要求,至少32个字符(256位),密钥过短会直接导致签名验证失败。

2. 修正请求管道与CORS配置

  • 确认app.UseAuthentication()在app.UseAuthorization()之前执行(当前代码顺序正确,无需调整)
  • 修改CORS配置,确保允许Authorization请求头,同时移除Origin地址末尾的斜杠:
    app.UseCors(policy =>
        policy.WithOrigins("http://localhost:3000", "https://localhost:3001")
            .AllowAnyMethod()
            .AllowAnyHeader()
    );
    

3. 验证Token生成逻辑

  • 对比TokenService与Program.cs中使用的Issuer、Audience、密钥是否完全一致
  • 解析生成的Token,检查iss、aud、exp等字段是否符合配置预期,确认签名算法为HmacSha256

4. 启用认证日志定位具体错误

在JWT认证配置中添加事件处理,输出详细错误信息:

.AddJwtBearer(options => {
     options.SaveToken = true;
     options.RequireHttpsMetadata = false;
     options.TokenValidationParameters = new TokenValidationParameters()
     {
         ValidateIssuer = true,
         ValidateAudience = true,   
         ValidateIssuerSigningKey = true,
         ValidateLifetime = true,
         ValidIssuer = builder.Configuration["JWT:Issuer"],
         ValidAudience = builder.Configuration["JWT:Audience"],
         IssuerSigningKey = new SymmetricSecurityKey(key)
     };
     options.Events = new JwtBearerEvents
     {
         OnAuthenticationFailed = context =>
         {
             Console.WriteLine($"认证失败: {context.Exception.Message}");
             return Task.CompletedTask;
         },
         OnChallenge = context =>
         {
             Console.WriteLine($"挑战失败: {context.ErrorDescription}");
             return Task.CompletedTask;
         }
     };
});

运行程序后查看控制台日志,直接获取无效Token的具体原因(如签名无效、issuer不匹配、Token过期等)

5. 优化Swagger配置

调整Swagger的安全定义为标准Bearer格式,方便测试:

builder.Services.AddSwaggerGen(options =>
{
    options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        In = ParameterLocation.Header,
        Description = "请输入格式为 `Bearer {Token}` 的授权令牌",
        Name = "Authorization",
        Type = SecuritySchemeType.Http,
        Scheme = "Bearer"
    });
    options.OperationFilter<SecurityRequirementsOperationFilter>();
});

关键代码验证点

  • Program.cs:默认认证Scheme设置为JwtBearerDefaults.AuthenticationScheme,TokenValidationParameters参数与Token生成逻辑完全匹配
  • TokenService:使用相同的密钥、Issuer、Audience生成Token,签名算法为SecurityAlgorithms.HmacSha256

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:49:59