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

.NET Core:使用Microsoft.Identity.Web保护Swagger UI遇问题求助

问题诊断与解决方案

问题根源

你当前使用JwtBearerDefaults.AuthenticationScheme调用ChallengeAsync无法触发OAuth2授权跳转,核心原因是:

  • JwtBearer认证方案的设计目标是验证API请求中的Bearer令牌,它的默认挑战逻辑是返回401 Unauthorized响应,而非重定向到OAuth授权页面。
  • 要触发Swagger UI所需的OAuth2授权码(PKCE)流程,必须使用OpenID Connect(OIDC)认证方案,它专门负责处理用户登录、授权跳转等交互逻辑。

正确实现步骤

1. 更新认证服务配置

在ConfigureServices中,添加OIDC认证方案,并设置默认挑战方案为OIDC,同时配置授权策略:

using Microsoft.AspNetCore.Authentication.OpenIdConnect;

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; // 指定挑战用OIDC方案
    })
    .AddMicrosoftIdentityWebApi(_configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(_configuration.GetSection("MicrosoftGraph"))
    .AddInMemoryTokenCaches()
    // 添加OIDC认证,处理Swagger的授权跳转
    .AddMicrosoftIdentityWebApp(_configuration.GetSection("AzureAd"));

    // 定义保护Swagger的授权策略
    services.AddAuthorization(options =>
    {
        options.AddPolicy("SwaggerAuth", policy => policy.RequireAuthenticatedUser());
    });
    //...
}

2. 用授权中间件保护Swagger路径

移除自定义的SwaggerAzureAdAuthMiddleware,改用ASP.NET Core原生的中间件来保护Swagger路径,并触发OIDC挑战:

public void Configure(IApplicationBuilder app)
{
    //...
    app.UseAuthentication();
    app.UseAuthorization();

    // 专门映射Swagger路径并应用保护
    app.MapWhen(context => context.Request.Path.StartsWithSegments("/swagger"), swaggerApp =>
    {
        // 应用Swagger授权策略
        swaggerApp.UseAuthorization();
        
        swaggerApp.Use(async (context, next) =>
        {
            if (!context.User.Identity.IsAuthenticated)
            {
                // 用OIDC方案发起挑战,触发授权跳转
                await context.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme);
                return;
            }
            await next();
        });

        swaggerApp.UseSwagger();
        swaggerApp.UseSwaggerUI(options =>
        {
            options.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1");
            options.OAuthClientId(_configuration.GetValue<string>("AzureAd:ClientId"));
            // 将Scopes字符串分割为数组(确保配置项是空格分隔的权限列表)
            options.OAuthScopes(_configuration.GetValue<string>("AzureAd:Scopes").Split(' ', StringSplitOptions.RemoveEmptyEntries));
            options.OAuthUsePkce();
            // 配置重定向URL,需与Azure AD应用注册中的重定向URI一致
            options.OAuthRedirectUrl($"{_configuration.GetValue<string>("AzureAd:Instance")}{_configuration.GetValue<string>("AzureAd:TenantId")}/oauth2/v2.0/authorize");
        });
    });
    //...
}

关键配置检查

  • Azure AD应用注册:必须添加http://localhost:<你的端口>/swagger/oauth2-redirect.html作为重定向URI(类型选择"Web"或"单页应用")。
  • Scopes配置:AzureAd:Scopes需为空格分隔的权限字符串,例如"api://{你的ClientId}/access_as_user openid profile",确保包含OpenID基础权限。
  • 中间件顺序:必须严格遵循UseAuthentication → UseAuthorization → Swagger相关中间件的顺序,否则认证逻辑会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:57:39