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

如何配置AddMicrosoftIdentityWebApiAuthentication同时支持双授权流

.NET 6 WebAPI 同时支持Azure B2C授权码流与客户端凭证流实现方案

异常原因

连续两次调用AddMicrosoftIdentityWebApiAuthentication时,方法默认会将注册的JWT Bearer认证方案命名为Bearer,重复注册同名认证方案会直接抛出System.InvalidOperationException:Scheme already exists: Bearer异常。

实现步骤

  • 保留原有appsettings.json中的AzureADB2C(授权码流)和AzureAd(客户端凭证流)配置,无需修改配置内容
  • 修改Program.cs中的认证注册逻辑,为两个认证流分配独立的方案名称,再配置全局授权策略,实现任意方案校验通过即可访问接口

Program.cs 正确配置代码

// 注册两个独立命名的认证方案,避免scheme重名
builder.Services.AddAuthentication()
    // 注册客户端凭证流认证方案,自定义方案名
    .AddMicrosoftIdentityWebApi(
        configuration: builder.Configuration.GetSection("AzureAd"),
        jwtBearerScheme: "Bearer-ClientCredentials"
    )
    // 注册B2C授权码流认证方案,自定义方案名
    .AddMicrosoftIdentityWebApi(
        configuration: builder.Configuration.GetSection("AzureADB2C"),
        jwtBearerScheme: "Bearer-B2CAuthCode"
    );

// 配置全局默认授权策略,两个认证方案任意一个校验通过即视为鉴权成功
builder.Services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .AddAuthenticationSchemes("Bearer-ClientCredentials", "Bearer-B2CAuthCode")
        .RequireAuthenticatedUser()
        .Build();
});

补充说明

  • 原有接口上的[Authorize]特性无需修改,即可同时兼容两类调用方:守护程序服务持有的客户端凭证流令牌、单页应用持有的B2C授权码流令牌均可正常访问受保护接口
  • 若需要对特定接口限制仅允许某类授权流访问,可在[Authorize]特性上显式指定对应方案名,例如仅允许客户端凭证流访问的接口可标注为[Authorize(AuthenticationSchemes = "Bearer-ClientCredentials")]
  • 两个认证方案的校验逻辑完全独立,单方案运行时的audience校验、issuer校验、scope/应用角色校验等规则均会正常生效,不会互相干扰
  • 如需调整单个方案的JWT令牌校验参数,可在对应AddMicrosoftIdentityWebApi方法的配置委托中传入自定义规则,写法与单方案注册时完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:27:20