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

ASP.NET Core 9 Web API的JWT认证401未授权问题排查

.NET 9 ASP.NET Core Web API JWT认证401未授权问题排查(Program.cs配置方向)

问题场景

基于.NET 9开发ASP.NET Core 9 Web API的JWT认证示例,技术栈包含MySQL、Pomelo和Entity Framework Core。核心控制器情况:

  • SecurityController的HardCodedLogin([FromBody] UsrCredentials login)方法可正常返回JWT令牌
  • LanguageController(代码如下)包含GetApplications方法,添加[AllowAnonymous]时能正常返回结果,但移除该特性后,通过Swagger登录并传递Bearer令牌访问,始终返回HTTP 401未授权错误,怀疑问题出在Program.cs配置中。

控制器代码:

[Route("api/[controller]")]
[ApiController]
[Authorize]
public class ApplicationController 
{
    // 包含GetApplications方法
}

常见Program.cs配置错误及修复方案

1. JWT认证服务参数不匹配

确保添加JWT认证服务时,配置的Issuer、Audience、SigningKey与令牌生成逻辑完全一致,否则会导致令牌验证失败。正确配置示例:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

检查令牌生成代码中的对应参数,必须和上述配置完全一致,包括大小写、字符串内容。

2. 中间件顺序错误

认证中间件必须在授权中间件之前执行,否则授权逻辑会在令牌解析前运行,导致401。正确的中间件顺序:

app.UseRouting();

app.UseAuthentication(); // 先执行认证,解析令牌
app.UseAuthorization(); // 再执行授权验证

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

如果UseAuthorization()在UseAuthentication()之前,会直接判定未授权。

3. Swagger未配置JWT令牌传递支持

若Swagger未正确配置JWT认证支持,可能导致令牌未被正确添加到请求头中。添加以下Swagger配置:

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" });
    
    var securityScheme = new OpenApiSecurityScheme
    {
        Name = "Authorization",
        Type = SecuritySchemeType.Http,
        Scheme = "bearer",
        BearerFormat = "JWT",
        In = ParameterLocation.Header,
        Description = "使用Bearer方案的JWT授权头",
        Reference = new OpenApiReference
        {
            Type = ReferenceType.SecurityScheme,
            Id = "Bearer"
        }
    };
    c.AddSecurityDefinition("Bearer", securityScheme);
    
    var securityRequirement = new OpenApiSecurityRequirement
    {
        { securityScheme, Array.Empty<string>() }
    };
    c.AddSecurityRequirement(securityRequirement);
});

配置后,Swagger界面会出现"Authorize"按钮,输入Bearer令牌后才能正确传递到请求头。

4. 令牌生成逻辑遗漏必要配置

检查SecurityController中生成JWT的代码,确保包含正确的签发方、受众、签名密钥和过期时间,示例:

var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
    issuer: _configuration["Jwt:Issuer"],
    audience: _configuration["Jwt:Audience"],
    expires: DateTime.Now.AddMinutes(30),
    signingCredentials: credentials);

return new JwtSecurityTokenHandler().WriteToken(token);

如果令牌缺少Issuer或Audience声明,会被Program.cs中的验证逻辑拒绝。

内容的提问来源于stack exchange,提问作者Jose Gustavo Roa de la Fuente

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:33:15