Как обеспечить безопасность пользовательского интерфейса Swagger с помощью аутентификации Windows - PullRequest
0 голосов
/ 18 июня 2020

У нас есть. Net Core 2.2 Web Api, который использует swagger ui для предоставления определений Web Api. Мы хотим защитить эту конечную точку только для пользователей внутри определенной группы AD. В настоящее время мы используем как Windows, так и анонимную аутентификацию. Проблема в том, что мы не можем заставить Swagger использовать Windows аутентификацию для блокировки пользователей.

Есть идеи?

1 Ответ

0 голосов
/ 18 июня 2020

Хотя и расстраивает, самый простой путь к защите конечной точки Swagger (через Swashbuckle), который я нашел до сих пор, - это просто поместить ее в свой собственный маршрут, а затем использовать простое промежуточное ПО для проверки состояния авторизации, как вы хотели бы ранее. чтобы подать его. Это было написано для NET Core 3.1 для проверки против претензий, поэтому вам может потребоваться настроить проверку авторизации для вашего сценария. Очевидно, вам все равно потребуется / вы захотите потребовать авторизацию на конечных точках, которые он документирует, но вы не обязательно хотите, чтобы каждый конечный пользователь имел доступ к документации в любом случае.

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

/// <summary>
/// Middleware to protect API Swagger docs
/// </summary>
public class SwaggerAuthorizationMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger _logger;

    public SwaggerAuthorizationMiddleware(RequestDelegate next, ILogger<SwaggerAuthorizationMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext context)
    {
        // If API documentation route and user isn't authenticated or doesn't have the appropriate authorization, then block
        if (context.Request.Path.StartsWithSegments("/apidoc"))
            && (!context.User.Identity.IsAuthenticated || !context.User.HasClaim("ClaimName", "ClaimValue")))
        {
            _logger.LogWarning($"API documentation endpoint unauthorized access attempt by [{context.Connection.RemoteIpAddress}]");
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            return;
        }

        await _next.Invoke(context);
    }
}

И во время запуска :

app.UseAuthorization(); // before the middleware
app.UseMiddleware<SwaggerAuthorizationMiddleware>();
app.UseSwagger(c =>
{
    c.RouteTemplate = "apidoc/swagger/{documentName}/swagger.json";
});
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/apidoc/swagger/v1/swagger.json", "My Service");
    c.RoutePrefix = "apidoc";
});
...