You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:12:19