Хотя и расстраивает, самый простой путь к защите конечной точки 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";
});