如何将NSwag Swagger UI排除在ASP.NET Core身份验证之外?
解决方案
要让Swagger UI完全跳过ASP.NET Core的身份验证(适配全局启用授权策略的场景),可以通过路由映射的方式给Swagger相关路径单独设置匿名访问权限,具体实现如下:
步骤1:注册Swagger服务(若未注册)
先确保已添加Swagger生成器的配置,若需要把AzureAD认证集成到Swagger UI中,还可以补充OAuth2相关配置:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); // 可选:集成AzureAD OAuth2到Swagger UI c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, Flows = new OpenApiOAuthFlows { Implicit = new OpenApiOAuthFlow { AuthorizationUrl = new Uri("https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/authorize"), Scopes = new Dictionary<string, string> { { "api://{你的客户端ID}/access_as_user", "以用户身份访问API" } } } } }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" } }, new[] { "api://{你的客户端ID}/access_as_user" } } }); });
步骤2:保留原有认证授权配置
你的AzureAD认证和全局授权策略配置可以保持不变:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(adSection); builder.Services.AddAuthorization(options => { // 默认所有请求遵循默认授权策略 options.FallbackPolicy = options.DefaultPolicy; });
步骤3:给Swagger路径设置匿名访问
在中间件配置阶段,用MapWhen将Swagger相关路径映射到单独的分支,并添加AllowAnonymous()来跳过身份验证:
var app = builder.Build(); if (app.Environment.IsDevelopment()) { // 匹配所有/swagger开头的请求,单独处理并允许匿名 app.MapWhen(ctx => ctx.Request.Path.StartsWithSegments("/swagger"), swaggerApp => { swaggerApp.UseSwagger(); swaggerApp.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API V1"); // 可选:若配置了OAuth2,添加Swagger UI的OAuth参数 c.OAuthClientId("{你的客户端ID}"); c.OAuthTenantId("{你的租户ID}"); }); }).AllowAnonymous(); } app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
这种方式会让所有/swagger开头的请求(包括Swagger UI页面和API描述JSON文件)都跳过全局授权策略,达到和控制器添加[AllowAnonymous]相同的效果。
内容的提问来源于stack exchange,提问作者Paul B
相关产品推荐
相关产品推荐

