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

.NET 10下Swagger认证异常:授权按钮恢复但无锁图标与请求头

.NET 10 + Swashbuckle 10.0.1 Swagger授权问题解决指南

问题背景

升级到.NET 10并切换到Swashbuckle.AspNetCore 10.0.1后,Swagger的Authorize按钮和受[Authorize]保护端点的锁形图标全部消失。按照网上方案添加SecurityDefinition和SecurityRequirement后,按钮回来了,但锁图标还是不显示,而且点授权按钮登录后,发送请求时根本不会自动带上Authorization头。

分步解决

1. 找回锁形图标

锁图标不显示是因为新版本Swashbuckle不会自动把[Authorize]特性和你定义的Bearer安全方案关联起来,得手动加个操作过滤器来扫描带授权特性的端点:

先在AddSwaggerGen里添加过滤器:

services.AddSwaggerGen(options =>
{
    // 保留你原来的SecurityDefinition配置
    options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Name = "Authorization",
        Description = "输入格式:Bearer 你的JWT Token",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http,
        Scheme = "Bearer",
        BearerFormat = "JWT"
    });

    // 新增操作过滤器,自动给带[Authorize]的端点加安全要求
    options.OperationFilter<SecurityRequirementsOperationFilter>();

    // 替换原有的AddSecurityRequirement写法,直接全局绑定
    options.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer"
                }
            },
            new List<string>()
        }
    });
});

如果项目中没有SecurityRequirementsOperationFilter,自己实现一个:

public class SecurityRequirementsOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // 提取当前端点的所有[Authorize]特性
        var authAttrs = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
            .Concat(context.MethodInfo.GetCustomAttributes(true))
            .OfType<AuthorizeAttribute>();

        if (!authAttrs.Any()) return;

        // 给这个端点加上Bearer安全要求
        operation.Security = new List<OpenApiSecurityRequirement>
        {
            new OpenApiSecurityRequirement
            {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                            Type = ReferenceType.SecurityScheme,
                            Id = "Bearer"
                        }
                    },
                    new List<string>()
                }
            }
        };

        // 增加401响应提示,同时触发锁图标显示
        operation.Responses.TryAdd("401", new OpenApiResponse { Description = "未授权" });
    }
}

2. 修复授权后请求头不自动携带问题

光后端配置还不够,Swagger UI那边也要开启授权支持:

app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API版本");
    // 启用授权功能,让UI能记住你输入的token
    options.UseAuthorization();
    // 如果用的是PKCE授权流程,可添加下面这句(可选)
    // options.OAuthUsePkce();
});

另外注意:在Authorize弹窗里输入token时,必须按Bearer 你的token格式输入,只输不带前缀的token,Swagger UI不会自动拼接成正确的请求头。

验证

  1. 重启项目打开Swagger UI,确认Authorize按钮和带[Authorize]端点的锁图标都正常显示
  2. 点击按钮输入正确格式的token并保存,发送请求
  3. 查看请求头,确认Authorization字段已自动携带

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 23:13:13