使用Swashbuckle.AspNetCore时如何保护/swagger/v1/swagger.json路由?

问题描述 投票:0回答:1

我需要记录一个 Web API。为此,我使用 Swagger。为了保护文档,我使用 RoutePrefix,只有授权人员才能访问,只有知道正确 RoutePrefix 的人(它是一个 guid)。但是任何知道我的应用程序基本路径的人在访问 myapp.com/swagger/v1/swagger.json 时都可以查看内容。我怎样才能保护这个端点?

我尝试过使用中间件,我认为这对我的问题来说有点复杂。

.net swagger swagger-ui swashbuckle.aspnetcore
1个回答
0
投票

通常swagger不用于生产环境,一般用于开发环境。

我们可以在默认模板中找到

IsDevelopment
条件。

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

我们知道中间件可以捕获所有的http请求,所以我们可以通过识别URL(/swagger/v1/swagger.json)来限制它,这是最简单的方法,并不复杂。

这是给您的样本。

public class SwaggerAuthMiddleware
{
    private readonly RequestDelegate _next;
    private const string SwaggerEndpoint = "/swagger/v1/swagger.json";
    private const string AuthHeaderName = "X-Swagger-Auth-Key";
    private const string AuthKey = "YourSecretKey"; // authkey in header

    public SwaggerAuthMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.Path.StartsWithSegments(SwaggerEndpoint))
        {
            if (!context.Request.Headers.TryGetValue(AuthHeaderName, out var extractedAuthKey))
            {
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                await context.Response.WriteAsync("Unauthorized access to Swagger documentation.");
                return;
            }

            if (!AuthKey.Equals(extractedAuthKey))
            {
                context.Response.StatusCode = StatusCodes.Status403Forbidden;
                await context.Response.WriteAsync("Forbidden access to Swagger documentation.");
                return;
            }
        }

        await _next(context);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.