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
相关产品推荐
相关产品推荐

