.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不会自动拼接成正确的请求头。
验证
- 重启项目打开Swagger UI,确认Authorize按钮和带
[Authorize]端点的锁图标都正常显示 - 点击按钮输入正确格式的token并保存,发送请求
- 查看请求头,确认Authorization字段已自动携带
内容的提问来源于stack exchange,提问作者Nermin
相关产品推荐
相关产品推荐

