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

