AspNetCore 给SwaggerUI加上登录保护功能

在ASP.NET Core项目中,Swagger UI是一个非常有用的工具,它允许开发人员以图形界面方式浏览和测试API。然而,在将Swagger UI部署到生产环境时,可能需要添加登录保护以确保API文档不被未授权用户访问。下面是一种在ASP.NET Core项目中为Swagger UI添加登录保护的方法:

1. 创建一个用于Swagger的授权策略

首先,你需要定义一个授权策略,这个策略将决定哪些用户或角色可以访问Swagger UI。这可以通过在Startup.csConfigureServices方法中添加授权策略来实现。

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文档的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AitTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值