.NET 6 Minimal Web API认证授权失效及Swagger报错问题
解决方案
1. 认证授权不生效问题修复
根因:Minimal API 不会继承静态类上的[Authorize]特性,你将授权特性打在Routes静态类上的写法对Minimal API端点无效。
修改方案:在路由映射时通过链式方法标记权限要求,修改ConfigureRoutes方法代码如下:
public static void ConfigureRoutes(this WebApplication app) { // 需要授权的端点加 RequireAuthorization() app.MapGet("PersonAuths", GetPersonAuths).RequireAuthorization(); app.MapGet("PersonAuths/{id}", GetPersonAuth).RequireAuthorization(); // 公开接口加 AllowAnonymous() app.MapPost("Login", Login).AllowAnonymous(); }
修改后可删除Routes类上的[Authorize]特性,该配置已无实际作用。
2. Swagger 500报错问题修复
根因:旧版本Swashbuckle.AspNetCore.Filters包中的SecurityRequirementsOperationFilter确实不支持Minimal API的端点元数据读取,会生成无效的swagger.json导致500报错。
两种可选修复方案:
方案一:替换为自定义适配Minimal API的操作过滤器(推荐,无第三方包依赖风险)
- 先删除对
Swashbuckle.AspNetCore.Filters包的引用,删除原来注释的c.OperationFilter<SecurityRequirementsOperationFilter>();行 - 项目内新增自定义过滤器类:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using Microsoft.AspNetCore.Authorization; public class MinimalApiAuthOperationFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 读取端点元数据判断权限要求 var needAuth = context.ApiDescription.ActionDescriptor.EndpointMetadata .Any(m => m is IAuthorizeData); var isAnonymous = context.ApiDescription.ActionDescriptor.EndpointMetadata .Any(m => m is IAllowAnonymous); if (needAuth && !isAnonymous) { operation.Security ??= new List<OpenApiSecurityRequirement>(); operation.Security.Add(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" } }, Array.Empty<string>() } }); } } }
- 在
AddSwaggerGen配置中注册自定义过滤器:
builder.Services.AddSwaggerGen( c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyAPI", Version = "v1" }); c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Description = "Standard Authorization header using the Bearer scheme. Example: \"bearer {token}\"", In = ParameterLocation.Header, Name = "Authorization", Type = SecuritySchemeType.ApiKey }); // 注册自定义过滤器 c.OperationFilter<MinimalApiAuthOperationFilter>(); });
方案二:升级Swashbuckle.AspNetCore.Filters到最新稳定版
如果不想自己写过滤器,可以将Swashbuckle.AspNetCore.Filters包升级到7.0.0及以上版本,新版已经适配了Minimal API的端点元数据,直接使用原来的SecurityRequirementsOperationFilter也不会报错。
效果验证
改完启动项目后,未携带有效JWT访问/PersonAuths会返回401状态码,Swagger界面中需要授权的接口会显示锁标识,点击后输入Bearer {你的token}即可调试授权接口。
内容的提问来源于stack exchange,提问作者Thed
相关产品推荐
相关产品推荐

