如何为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
相关产品推荐
相关产品推荐

