升级NuGet包后ASP.NET Core 3.1中Swagger授权头不显示原因排查
升级NuGet包后ASP.NET Core 3.1 Swagger不再显示授权头的解决方案
这个问题大概率是因为你升级Swashbuckle相关NuGet包后,ASP.NET Core API描述的内部获取逻辑发生了变化,导致你原来通过FilterDescriptors检测授权过滤器的方式失效了。
问题根源
在旧版本的Swashbuckle中,通过filterPipeline.Select(filterInfo => filterInfo.Filter)可以直接拿到AuthorizeFilter和IAllowAnonymousFilter,但升级后,这些过滤器的元数据存储方式变了,不再能通过这种方式正确检测到是否需要授权,所以你的代码里的isAuthorized和allowAnonymous判断始终为false,自然不会添加Authorization头参数。
修复方案
修改你的AuthorizationHeaderParameterOperationFilter类,改用EndpointMetadata来检测授权属性,这是更可靠且兼容新版本的方式:
public class AuthorizationHeaderParameterOperationFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 改用EndpointMetadata检测是否有Authorize属性 var isAuthorized = context.ApiDescription.ActionDescriptor.EndpointMetadata .Any(m => m is AuthorizeAttribute); // 检测是否有AllowAnonymous属性 var allowAnonymous = context.ApiDescription.ActionDescriptor.EndpointMetadata .Any(m => m is AllowAnonymousAttribute); if (isAuthorized && !allowAnonymous) { operation.Parameters ??= new List<OpenApiParameter>(); operation.Parameters.Add(new OpenApiParameter { Name = "Authorization", In = ParameterLocation.Header, Description = "access token", Required = true, Schema = new OpenApiSchema { Type = "string", Default = new OpenApiString("Bearer ") } }); } if (allowAnonymous) { operation.Parameters ??= new List<OpenApiParameter>(); operation.Parameters.Add(new OpenApiParameter { Name = "Authorization", In = ParameterLocation.Header, Description = "basic authentication", Required = true, Schema = new OpenApiSchema { Type = "string", Default = new OpenApiString("Basic ") } }); } } }
额外注意事项
- 确保你安装的
Swashbuckle.AspNetCore版本和ASP.NET Core 3.1兼容:ASP.NET Core 3.1对应的Swashbuckle版本应该是5.x系列,如果不小心升级到了6.x及以上版本(这些是为.NET 5+设计的),可能会出现更多兼容性问题,建议降级到匹配的版本。 - 检查你的
Startup.cs中是否正确注册了Swagger服务,确保services.AddSwaggerGen()的配置没有遗漏。
内容的提问来源于stack exchange,提问作者001
相关产品推荐
相关产品推荐

