You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为NSwag注册的Swagger UI端点应用自定义授权过滤器

为NSwag Swagger UI端点添加自定义授权验证

要让自定义授权逻辑作用于NSwag注册的/swagger端点,可通过中间件管道匹配特定路径并应用授权逻辑实现,具体步骤如下:

1. 提取公共授权逻辑(复用代码)

为避免过滤器和中间件重复编写授权逻辑,先将MyAuthorizeFilter的核心逻辑封装到公共类中:

public static class AuthorizationHelper
{
    // 封装自定义授权逻辑,返回IActionResult表示未授权结果,null表示授权通过
    public static IActionResult? CheckAuthorization(HttpContext context)
    {
        // 复制你原MyAuthorizeFilter.OnAuthorization中的逻辑
        // 示例逻辑(根据实际需求修改):
        if (!context.User.Identity?.IsAuthenticated ?? true)
        {
            // 未认证时返回挑战结果(如跳转到登录页)
            return new ChallengeResult();
        }

        // 可添加其他自定义验证逻辑,比如检查用户权限
        // if (!context.User.HasClaim("Permission", "ViewSwagger"))
        // {
        //     return new ForbidResult();
        // }

        return null; // 授权通过,继续执行后续流程
    }
}

2. 更新自定义授权过滤器

修改MyAuthorizeFilter,让它调用公共授权逻辑:

public sealed class MyAuthorizeFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var result = AuthorizationHelper.CheckAuthorization(context.HttpContext);
        if (result != null)
        {
            context.Result = result;
        }
    }
}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class MyAuthorizeAttribute : TypeFilterAttribute
{
    public MyAuthorizeAttribute(params string[] arguments)
        : base(typeof(MyAuthorizeFilter))
    {
        // 保留原有构造逻辑
    }
}

3. 创建授权中间件

编写中间件,用于在Swagger路径上应用公共授权逻辑:

public class MyAuthorizationMiddleware
{
    private readonly RequestDelegate _next;

    public MyAuthorizationMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var authResult = AuthorizationHelper.CheckAuthorization(context);
        if (authResult != null)
        {
            // 执行未授权结果(如跳转登录页)
            await authResult.ExecuteResultAsync(new ActionContext(
                context, 
                context.GetRouteData(), 
                new ControllerActionDescriptor()
            ));
            return;
        }

        // 授权通过,继续执行Swagger UI中间件
        await _next(context);
    }
}

4. 配置Swagger UI路由与授权

在Startup.Configure()方法中,替换原app.UseSwaggerUi();,用MapWhen匹配所有/swagger开头的路径,先应用授权中间件再启用Swagger UI:

// 替换原有的app.UseSwaggerUi();
app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments("/swagger"), swaggerPipeline =>
{
    // 先应用自定义授权中间件
    swaggerPipeline.UseMiddleware<MyAuthorizationMiddleware>();
    // 再启用Swagger UI
    swaggerPipeline.UseSwaggerUi();
});

此后,所有访问/swagger及其子路径的请求都会先经过自定义授权逻辑,仅授权通过的用户可查看Swagger UI。


内容的提问来源于stack exchange,提问作者RobSiklos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:13:11