将基于声明的授权策略应用于 .Net Core 3.1 中的 Swagger UI

Apply claims-based authorization policy to Swagger UI in .Net Core 3.1

我使用 ASP.Net Core 3.1 制作了一个 API 并且我使用 Swashbuckle 在站点的根目录添加了 Swagger UI。也许这是一个微不足道的问题,但我希望 Swagger UI 仅供授权用户访问(即不公开)。我读过很多关于 Swagger 如何处理 API 授权方案的文章,但 none 关于 Swagger UI 本身的文章。特别是我需要通过某些 [Authorize(Policy="MyCustomPolicy")] 属性或等效属性来限制对它创建的静态文件的访问,因此只有在其身份中具有特定声明的用户才能访问 UI。此条件仅在 Swagger UI 上需要,因为 API 本身已经通过 Bearer 身份验证进行访问控制并且工作正常。

如何将此声明要求添加到 Swagger UI?

这是我添加 Swagger 服务的方式:

// Register the Swagger Generator service. This service is responsible for genrating Swagger Documents.
// Note: Add this service at the end after AddMvc() or AddMvcCore().
services.AddSwaggerGen(c =>
{
        c.SwaggerDoc("v1", new OpenApiInfo
        {
            Title = "MySystem API",
            Version = "v1",
            Description = "API for MySystem.",
            Contact = new OpenApiContact
            {
                Name = "MyCompany S.A.",
                Email = string.Empty,
                Url = new System.Uri("https://contoso.com/"),
            },
        });

        var filePath = System.IO.Path.Combine(System.AppContext.BaseDirectory, "MySystem.Web.xml");
        c.IncludeXmlComments(filePath);

        c.CustomSchemaIds(x => x.GetCustomAttributes(false).OfType<DisplayNameAttribute>().FirstOrDefault()?.DisplayName ?? x.Name);
    });

这就是我将 Swagger 添加到构建器的方式:

    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseSwagger();

    // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
    // specifying the Swagger JSON endpoint.
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MySystem API v1");

        // To serve SwaggerUI at application's root page, set the RoutePrefix property to an empty string.
        c.RoutePrefix = string.Empty;
    });

提前致谢。

原来这个回答是here。我只需要添加:

app.UseAuthentication(); // before UseAuthorization()

// Original answer
app.UseAuthorization(); // before the middleware
...