如何保护.NET Core API中的swagger端点?

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

我在.net core 2.1中有一个api构建。为了限制对各种端点的访问,我使用IdentityServer4和[Authorize]属性。但是,我在开发过程中的目标是向我们的开发人员公开api swagger文档,以便他们无论在哪里工作都可以使用它。我面临的挑战是如何保护swagger index.html文件,以便只有他们才能看到api的详细信息。

我已经在wwwroot / swagger / ui文件夹中创建了一个自定义index.html文件,并且一切正常,但是,该文件使用来自/swagger/v1/swagger.json端点的不受保护的数据。我想知道如何覆盖该特定端点的返回值,以便可以向其添加自己的身份验证?

编辑:

当前,我已经通过以下中间件实现了上述目标:

public class SwaggerInterceptor
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        var uri = context.Request.Path.ToString();
        if (uri.StartsWith("/swagger/ui/index.html"))
        {
            var param = context.Request.QueryString.Value;

            if (!param.Equals("?key=123"))
            {
                context.Response.StatusCode = 404;
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync("{\"result:\" \"Not Found\"}", Encoding.UTF8);
                return;
            }
        }

        await _next.Invoke(context);
    }
}

public class Startup 
{
    //omitted code

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMiddleware<SwaggerInterceptor>();
        //omitted code
    }
}

我不喜欢这种方法,因为它将检查每个请求。有没有更好的方法来实现这一目标?上面仅保护index.html文件,但我可以对其进行调整以类似方式保护json端点。

c# api swagger asp.net-core-2.0 swagger-ui
1个回答
0
投票

我相信您最好的选择就是您已经做过的。构建您自己的中间件,因为我不知道任何用于验证静态文件的中间件。您可以添加basePath以避免不必要时在此特定的中间件中输入。像下面的代码

app.Map("/swagger", (appBuilder) =>
{
    appBuilder.UseMiddleware<SwaggerInterceptor>();
});

本文还可以帮助您构建更通用的中间件,以对静态文件进行验证。https://odetocode.com/blogs/scott/archive/2015/10/06/authorization-policies-and-middleware-in-asp-net-5.aspx

© www.soinside.com 2019 - 2024. All rights reserved.