在ASP.NET Core中用Microsoft.Identity.Web实现多Bearer认证方案
多认证方案下同时验证Azure AD与Azure AD B2C Bearer令牌的解决方案
要实现同时验证来自Azure AD(跨租户)和Azure AD B2C的Bearer令牌,你需要为两种认证场景配置独立的认证方案,并通过自定义授权策略让系统尝试用多个方案验证令牌,具体步骤如下:
1. 配置独立的认证方案名称
为Azure AD和Azure AD B2C分别指定唯一的Scheme名称(比如AADBearer和B2CBearer),避免Scheme名称冲突导致的异常。
2. 注册两个Microsoft Identity Web Api认证方案
在服务配置中,两次调用AddMicrosoftIdentityWebApi,分别绑定对应的配置项,并指定各自的Scheme名称:
// 配置Azure AD认证方案 builder.Services.AddAuthentication() .AddMicrosoftIdentityWebApi(options => { // 绑定Azure AD配置(来自appsettings.json) builder.Configuration.Bind("AzureAd", options); // 可选:自定义令牌验证参数,比如声明映射 options.TokenValidationParameters.NameClaimType = "name"; }, schemeOptions => { // 指定Azure AD对应的Scheme名称 schemeOptions.SchemeName = "AADBearer"; }) // 配置Azure AD B2C认证方案 .AddMicrosoftIdentityWebApi(options => { // 绑定Azure AD B2C配置(来自appsettings.json) builder.Configuration.Bind("AzureAdB2C", options); options.TokenValidationParameters.NameClaimType = "name"; }, schemeOptions => { // 指定Azure AD B2C对应的Scheme名称 schemeOptions.SchemeName = "B2CBearer"; });
3. 配置授权策略,允许多方案验证
创建默认授权策略,让系统尝试用两个Scheme中的任意一个验证令牌,只要其中一个验证通过即视为认证成功:
builder.Services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() // 添加两个认证Scheme,系统会依次尝试验证 .AddAuthenticationSchemes("AADBearer", "B2CBearer") .Build(); });
4. 确保中间件顺序正确
在管道配置中,确保UseAuthentication和UseAuthorization的顺序正确:
app.UseAuthentication(); app.UseAuthorization();
配置文件示例(appsettings.json)
确保配置文件中包含Azure AD和Azure AD B2C的独立配置项:
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "your-aad-tenant-id", "ClientId": "your-aad-api-client-id", "Audience": "your-aad-api-audience" }, "AzureAdB2C": { "Instance": "https://your-b2c-domain.b2clogin.com/", "Domain": "your-b2c-domain.onmicrosoft.com", "ClientId": "your-b2c-api-client-id", "SignUpSignInPolicyId": "B2C_1_signup_signin", "Audience": "your-b2c-api-audience" } }
问题原因说明
- 重复使用
BearerScheme会触发异常,因为每个认证方案必须拥有唯一的名称。 - 仅
Bearer2生效是因为默认授权策略只验证了单个Scheme,未配置多方案尝试逻辑,通过自定义授权策略即可解决此问题。
内容的提问来源于stack exchange,提问作者Mason A
相关产品推荐
相关产品推荐

