Swagger UI不显示Authorize按钮的根本原因是OpenAPI文档未声明认证方案,必须同时配置AddSecurityDefinition("Bearer",...)和AddSecurityRequirement(...),且Scheme名称严格匹配小写"bearer",并确保认证中间件加载顺序正确(AddAuthentication→AddAuthorization→AddEndpointsApiExplorer→AddSwaggerGen→UseRouting→UseAuthentication→UseAuthorization→UseSwaggerUI)。

Swagger UI 不显示 Authorize 按钮,基本就是 AddSecurityDefinition 和 AddSecurityRequirement 没配全,或者中间件顺序错了。
为什么 Swagger UI 里没 Authorization 按钮
根本不是“没启用”或“插件没装”,而是 OpenAPI 文档生成时压根没声明认证方案。Swashbuckle 不会自动识别你用了 JWT,必须手动告诉它:AddSecurityDefinition("Bearer", ...) 定义方案,再用 AddSecurityRequirement(...) 告诉它“哪些接口需要这个方案”。漏掉任一环节,按钮就不会出现。
常见错误包括:
-
Scheme = "Bearer"写成首字母大写 —— 必须小写"bearer",否则 OpenAPI 规范不认 - 只加了
AddSecurityDefinition,但没调AddSecurityRequirement,按钮显示了也点不动 - 把
AddSecurityRequirement传了个空字典或错的 key,比如{"JWT", ...}而不是{"Bearer", ...}
.NET 6+ Program.cs 中认证与 Swagger 的加载顺序
顺序错一个位置,就会出现:Swagger 页面空白、控制台报 Failed to load API definition、或点击 Authorize 后调接口仍返回 401 Unauthorized —— 实际请求根本没进认证中间件。
正确顺序是(缺一不可):
-
AddAuthentication().AddJwtBearer(...)→ 先注册认证方案 -
AddAuthorization()→ 注册默认策略(如options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()) -
AddEndpointsApiExplorer()+AddSwaggerGen(...)→ 此时才能在配置中引用前面定义的"Bearer"scheme 名 -
UseRouting()→ 紧接着 -
UseAuthentication()和UseAuthorization()→ 必须在UseSwaggerUI()之前
Authorize 按钮点了却没把 token 加到请求头里
这不是后端配置失败,是前端行为逻辑没触发。Swagger UI 默认不会给所有接口自动加 Authorization: Bearer xxx,它只对明确标注了认证要求的接口才注入 token。
必须同时满足:
- 控制器或 Action 上打了
[Authorize]特性 -
AddSecurityRequirement已正确绑定到该接口的 OpenAPI 描述中(Swashbuckle 默认能识别[Authorize],但前提是没用自定义策略名绕过它) - Swagger UI 加载的文档里,对应接口的
security字段包含{"Bearer": []}
如果用了类似 [Authorize(Policy = "MyPolicy")] 这种自定义策略,且没在 AddSecurityRequirement 中显式映射,Swagger 就不会自动关联 token。
容易被忽略的细节
很多人配完发现 token 输入后还是 401,翻日志看到 Bearer was not authenticated,其实问题不在 Swagger,而在 JWT 验证本身:
-
MetadataAddress地址拼错、网络不通,或返回的 JWKS 不含有效 signing key -
Audience和授权服务器发的 token 中aud字段不一致(注意大小写和数组/字符串差异) - 本地调试时用了
ValidateIssuerSigningKey = true,但没配IssuerSigningKey,也没走MetadataAddress自动拉取 - Swagger UI 发起的请求是浏览器发起的,若后端开了 CORS 但没允许
Authorization头,预检请求会失败,表现为静默无响应


















