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

.NET Core 3.1升级至.NET 6后API调用出现401未授权错误求助

ASP.NET Core 3.1升级到6.0后API访问失败(JWT相关排查指南)

一、确认JWT包引用正确性

.NET 6中,Microsoft.AspNetCore.Authentication.JwtBearer已整合进ASP.NET Core框架,无需单独通过NuGet安装。检查你的.csproj文件:

  • 移除旧版本的<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="x.x.x" />引用
  • 确保项目Sdk为<Project Sdk="Microsoft.NET.Sdk.Web">,目标框架设置为<TargetFramework>net6.0</TargetFramework>

二、检查Startup.cs的认证配置差异

.NET 6对认证中间件配置逻辑有微调,重点核对ConfigureServices和Configure方法:

1. ConfigureServices中的JWT配置

确保JWT认证配置正确绑定配置项,策略设置无遗漏:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = Configuration["Jwt:Issuer"], // 确认配置键与appsettings.json完全匹配(大小写敏感)
            ValidAudience = Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
        };
        // .NET 6新增:如需排查token验证失败原因,可在此添加日志逻辑
        options.Events = new JwtBearerEvents
        {
            OnAuthenticationFailed = context =>
            {
                if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
                {
                    context.Response.Headers.Add("Token-Expired", "true");
                }
                return Task.CompletedTask;
            }
        };
    });

// 核对自定义授权策略(如有)
services.AddAuthorization(options =>
{
    options.AddPolicy("YourPolicy", policy => policy.RequireClaim("Role", "Admin"));
});

2. Configure中的中间件顺序

.NET 6对中间件顺序要求严格,必须保证认证中间件在授权前执行:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();
    app.UseRouting();

    // 必须在UseAuthorization之前调用UseAuthentication,否则认证不生效
    app.UseAuthentication(); 
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

关键错误点:若UseAuthentication在UseAuthorization之后,会直接导致前端请求返回401。

三、检查控制器与路由配置

  1. 确认控制器授权属性正确应用:
[ApiController]
[Route("api/[controller]")]
[Authorize] // 或指定自定义策略[Authorize(Policy = "YourPolicy")]
public class YourController : ControllerBase
{
    [HttpGet]
    public IActionResult GetData()
    {
        return Ok("Data");
    }

    // 无需认证的方法需添加[AllowAnonymous]
    [HttpGet("public")]
    [AllowAnonymous]
    public IActionResult GetPublicData()
    {
        return Ok("Public Data");
    }
}
  1. 核对路由属性[Route]的格式,确保与前端请求路径匹配。

四、从报错堆栈定位问题

根据你提供的报错信息,重点关注:

  • 若抛出InvalidOperationException提示“未配置默认认证方案”,说明AddAuthentication未指定默认Scheme,或中间件顺序错误
  • 若抛出SecurityTokenInvalidSignatureException,说明JWT签名密钥与生成token的密钥不一致
  • 若返回401 Unauthorized但token本身有效,检查TokenValidationParameters中的ValidIssuer/ValidAudience是否与token的Issuer/Audience完全匹配

五、快速验证方法

  1. 临时给目标控制器方法添加[AllowAnonymous],若前端能正常访问,可确认问题出在JWT认证环节
  2. 用Postman直接调用API并携带正确的Bearer token,查看响应头的WWW-Authenticate字段获取具体错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:53:36