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

.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的操作过滤器(推荐,无第三方包依赖风险)

  1. 先删除对Swashbuckle.AspNetCore.Filters包的引用,删除原来注释的c.OperationFilter<SecurityRequirementsOperationFilter>();行
  2. 项目内新增自定义过滤器类:
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>()
                }
            });
        }
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:45:01