ASP.NET Core Swagger:仅为指定接口配置安全验证,移除Register接口锁
解决ASP.NET Core WebAPI Swagger全局Bearer下移除Register接口锁图标问题
你可以通过自定义Swagger文档过滤器实现需求,无需修改自动生成的Swagger文件。以下是两种常用方案:
方案一:硬编码指定接口移除安全要求
创建实现IDocumentFilter的过滤器类,在Swagger文档生成时手动移除Register接口的安全要求:
public class RemoveRegisterSecurityFilter : IDocumentFilter { public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // 匹配Register接口的路径(根据实际路由调整) var registerPath = swaggerDoc.Paths.Keys.FirstOrDefault(p => p.EndsWith("/api/Account/Register", StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(registerPath)) { // 清除该路径下所有请求方法的安全要求 foreach (var operation in swaggerDoc.Paths[registerPath].Operations.Values) { operation.Security.Clear(); } } } }
在Swagger配置中注册这个过滤器:
builder.Services.AddSwaggerGen(c => { // 全局Bearer安全定义 c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "Bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "JWT授权头,格式为Bearer {token}" }); // 全局安全要求 c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty<string>() } }); // 注册自定义过滤器 c.DocumentFilter<RemoveRegisterSecurityFilter>(); });
方案二:自动识别[AllowAnonymous]接口
如果Register接口已标记[AllowAnonymous]特性,可使用通用过滤器自动移除所有匿名接口的安全要求:
public class RemoveAnonymousSecurityFilter : IDocumentFilter { public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // 获取所有标记了AllowAnonymous的接口路径 var anonymousApiPaths = context.ApiDescriptions .Where(desc => desc.ActionDescriptor.EndpointMetadata.Any(m => m is AllowAnonymousAttribute)) .Select(desc => $"/{desc.RelativePath}"); foreach (var path in anonymousApiPaths) { if (swaggerDoc.Paths.TryGetValue(path, out var openApiPath)) { foreach (var operation in openApiPath.Operations.Values) { operation.Security.Clear(); } } } } }
同样在Swagger配置中注册过滤器,并确保Register接口添加特性:
[ApiController] [Route("api/Account")] public class AccountController : ControllerBase { [AllowAnonymous] [HttpPost("Register")] public IActionResult Register([FromBody] RegisterRequest request) { // 注册逻辑 return Ok("注册成功"); } // 其他需要授权的接口 [HttpGet("UserInfo")] public IActionResult GetUserInfo() { return Ok(new { Name = "test" }); } }
两种方案均无需修改自动生成的Swagger文件,仅通过代码配置调整文档生成逻辑,即可精准移除指定接口的锁图标。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

