使用Swashbuckle.AspNetCore时如何保护/swagger/v1/swagger.json路由?
保护Swagger的swagger.json端点的简单方案
针对你不想用复杂中间件的需求,这里有几个轻量的实现方式:
方案1:给swagger.json端点添加授权验证
直接利用ASP.NET Core的授权机制,给swagger.json的映射端点加上授权要求,和你保护SwaggerUI的逻辑一致:
// 配置SwaggerUI app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); c.RoutePrefix = "你的GUID前缀"; }); // 给swagger.json端点强制要求授权 app.MapSwagger("{documentName}/swagger.json") .RequireAuthorization();
这样只有通过授权的用户才能访问swagger.json,和SwaggerUI的访问权限保持统一。
方案2:修改swagger.json的路由前缀,隐藏默认路径
把swagger.json的默认路径改成和SwaggerUI一样的GUID前缀,让不知道GUID的人无法找到该端点:
// 修改swagger.json的路由模板,添加GUID前缀 app.UseSwagger(c => { c.RouteTemplate = "你的GUID前缀/swagger/{documentName}/swagger.json"; }); // 配置SwaggerUI指向修改后的swagger.json路径 app.UseSwaggerUI(c => { c.SwaggerEndpoint("/你的GUID前缀/swagger/v1/swagger.json", "My API V1"); c.RoutePrefix = "你的GUID前缀"; });
此时原来的/swagger/v1/swagger.json路径会失效,必须使用带GUID前缀的路径才能访问swagger.json,和SwaggerUI的入口保持一致。
方案3:IP白名单限制(极简中间件)
如果你的授权人员是固定IP范围,可以用一个超简单的中间件做IP过滤,完全谈不上复杂:
首先实现极简的IP限制中间件:
public class IpRestrictionMiddleware { private readonly RequestDelegate _next; // 替换成你的授权IP列表 private readonly HashSet<string> _allowedIps = new HashSet<string> { "192.168.1.100", "10.0.0.5" }; public IpRestrictionMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var clientIp = context.Connection.RemoteIpAddress?.ToString(); // 处理IPv6格式的本地IP if (clientIp == "::1") clientIp = "127.0.0.1"; if (!_allowedIps.Contains(clientIp)) { context.Response.StatusCode = StatusCodes.Status403Forbidden; await context.Response.WriteAsync("无访问权限"); return; } await _next(context); } }
然后在Program.cs里只给swagger.json路径应用这个中间件:
// 仅对swagger.json路径应用IP限制 app.UseWhen(context => context.Request.Path.StartsWithSegments("/swagger/v1/swagger.json"), appBuilder => appBuilder.UseMiddleware<IpRestrictionMiddleware>() );
这个中间件只有几十行代码,逻辑简单直接,完全符合你不想用复杂中间件的需求。
内容的提问来源于stack exchange,提问作者BRENO SANTOS BARROSO Breno Bar
相关产品推荐
相关产品推荐

