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

.NET 9下Swagger UI的Authorize按钮不显示如何解决?

问题:.NET 9中Swagger UI的Authorize按钮不显示

在.NET 8中使用AddEndpointsApiExplorer+UseSwagger配合AddSwaggerGen的安全配置时,Swagger UI的Authorize按钮正常显示,但升级到.NET 9改用AddOpenApi+MapOpenApi后,按钮消失。

原因

.NET 9引入的AddOpenApi是独立的OpenAPI文档生成器,默认不会共享AddSwaggerGen中配置的安全定义。当前代码中MapOpenApi()暴露的是AddOpenApi生成的文档,这份文档未包含AddSwaggerGen里的Bearer认证配置,因此Swagger UI无法识别并显示Authorize按钮。

解决方法

方法1:沿用.NET 8的配置模式(快速恢复)

将配置改回与.NET 8一致的组合,让SwaggerUI加载AddSwaggerGen生成的文档:

  1. 替换AddOpenApi为AddEndpointsApiExplorer
  2. 替换MapOpenApi()为UseSwagger()

修改后的核心代码:

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddControllers();
        // 替换AddOpenApi为AddEndpointsApiExplorer
        builder.Services.AddEndpointsApiExplorer();
        builder.Services.AddSwaggerGen(options =>
        {
            options.AddSecurityDefinition("bearerAuth", new()
            {
                Type = SecuritySchemeType.Http,
                In = ParameterLocation.Header,
                Scheme = "Bearer",
                BearerFormat = "JWT",
                Name = "Authorization",
                Description = "Enter your bearer token"
            });
            options.AddSecurityRequirement(new()
            {
                {
                    new()
                    {
                        Reference = new()
                        {
                            Type = ReferenceType.SecurityScheme,
                            Id = "bearerAuth"
                        }
                    },
                    Array.Empty<string>()
                }
            });
        });
        var app = builder.Build();
        if (app.Environment.IsDevelopment())
        {
            // 替换MapOpenApi()为UseSwagger()
            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
            });
            app.MapGet("/", async context =>
            {
                await Task.Run(() => context.Response.Redirect("./swagger/index.html", permanent: false));
            });
        }
        app.UseHttpsRedirection();
        app.UseAuthorization();
        app.MapControllers();
        app.Run();
    }
}

方法2:基于.NET 9的AddOpenApi配置认证

如果想保留.NET 9的新API,直接在AddOpenApi中配置安全定义,无需依赖AddSwaggerGen(如果不需要SwaggerGen的其他功能):

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddControllers();
        builder.Services.AddOpenApi(options =>
        {
            options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
            // 在AddOpenApi中添加安全定义
            options.AddSecurityDefinition("bearerAuth", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
            {
                Type = Microsoft.OpenApi.Models.SecuritySchemeType.Http,
                In = Microsoft.OpenApi.Models.ParameterLocation.Header,
                Scheme = "Bearer",
                BearerFormat = "JWT",
                Name = "Authorization",
                Description = "Enter your bearer token"
            });
            // 添加安全要求
            options.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
            {
                {
                    new Microsoft.OpenApi.Models.OpenApiSecurityScheme
                    {
                        Reference = new Microsoft.OpenApi.Models.OpenApiReference
                        {
                            Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme,
                            Id = "bearerAuth"
                        }
                    },
                    Array.Empty<string>()
                }
            });
        });
        var app = builder.Build();
        if (app.Environment.IsDevelopment())
        {
            app.MapOpenApi();
            app.UseSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/openapi/v1.json", "v1");
            });
            app.MapGet("/", async context =>
            {
                await Task.Run(() => context.Response.Redirect("./swagger/index.html", permanent: false));
            });
        }
        app.UseHttpsRedirection();
        app.UseAuthorization();
        app.MapControllers();
        app.Run();
    }
}

说明

两种方法任选其一即可:

  • 方法1适合希望保持原有配置习惯、快速解决问题的场景;
  • 方法2适合拥抱.NET 9新特性、不想依赖SwaggerGen额外配置的场景。

内容的提问来源于stack exchange,提问作者Mr. X

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:35:53