AspNetCore 给SwaggerUI加上登录保护功能
在ASP.NET Core项目中,Swagger UI是一个非常有用的工具,它允许开发人员以图形界面方式浏览和测试API。然而,在将Swagger UI部署到生产环境时,可能需要添加登录保护以确保API文档不被未授权用户访问。下面是一种在ASP.NET Core项目中为Swagger UI添加登录保护的方法:
1. 创建一个用于Swagger的授权策略
首先,你需要定义一个授权策略,这个策略将决定哪些用户或角色可以访问Swagger UI。这可以通过在Startup.cs
的ConfigureServices
方法中添加授权策略来实现。
public void ConfigureServices(IServiceCollection services)
{ // 其他配置... services.AddAuthorization(options => { // 定义Swagger UI的访问策略 options.AddPolicy("SwaggerPolicy", policy => policy.RequireAuthenticatedUser().RequireRole("Admin")); }); // 添加Swagger服务 services.AddSwaggerGen(c => { // 配置Swagger的其他选项... }); // 其他服务配置...
}
2. 创建一个中间件来检查访问Swagger UI的请求
接下来,你需要创建一个中间件来检查访问Swagger UI的请求,并根据定义的策略进行授权。
public class SwaggerAuthorizeCheck
{ private readonly RequestDelegate _next; public SwaggerAuthorizeCheck(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var endpoint = context.GetEndpoint(); // 检查是否访问Swagger相关的路径 if (endpoint?.Metadata.GetMetadata<ApiExplorerSettingsAttribute>()?.IgnoreApi == false && (context.Request.Path.StartsWithSegments("/swagger") || context.Request.Path.StartsWithSegments("/oidc-debug"))) { // 执行授权检查 var authorizeData = endpoint.Metadata.GetMetadata<IAuthorizeData>() ?? new AuthorizeAttribute { Policy = "SwaggerPolicy" }; var policy = await context.RequestServices.GetRequiredService<IAuthorizationPolicyProvider>().GetPolicyAsync(authorizeData.Policy); var authorizeResult = await context.RequestServices .GetRequiredService<IAuthorizationService>() .AuthorizeAsync(context.User, endpoint, policy); if (!authorizeResult.Succeeded) { // 授权失败,重定向到登录页面或其他处理 context.Response.StatusCode = 403; // Forbidden await context.Response.WriteAsync("Unauthorized access to Swagger UI."); return; } } // 如果不是Swagger请求,则调用管道中的下一个中间件 await _next(context); }
} // 在Startup.cs的Configure方法中添加中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ // 其他配置... app.UseMiddleware<SwaggerAuthorizeCheck>(); // Swagger中间件 app.UseSwagger(); app.UseSwaggerUI(c => { // Swagger UI配置... }); // 其他中间件配置...
}
3. 注意事项
- 请确保你已经配置了适当的身份验证和授权服务(如Identity Server、Cookie、JWT等),以便中间件能够验证用户身份和角色。
- 示例中的
"/oidc-debug"
路径假设你使用了某些OAuth2/OpenID Connect的调试页面,这些页面可能也需要保护。请根据你的实际情况调整。 - 根据你的应用需求,可能需要调整Swagger的URL路径和授权策略。
通过上述步骤,你可以为ASP.NET Core项目中的Swagger UI添加基本的登录保护功能,从而增强API文档的安全性。