如何同时配置Azure B2C新旧Instance实例兼容客户端旧配置?
解决方案
错误原因是两次配置都使用了默认的Bearer认证方案名称,导致冲突。要同时兼容两个实例,需为每个认证配置指定唯一方案名,并通过策略方案统一处理令牌验证。
1. 为两个实例配置唯一认证方案名
修改Startup代码,分别为旧、新实例指定不同的方案名称(比如AzureAdB2COldBearer和AzureAdB2CNewBearer):
// 配置旧Instance认证 services.AddAuthentication() .AddMicrosoftIdentityWebApi("AzureAdB2COldBearer", options => { Configuration.Bind("AzureAdB2COld", options); options.TokenValidationParameters.NameClaimType = "email"; options.Events = new JwtBearerEvents() { OnTokenValidated = async (context) => { var principalService = context.HttpContext.RequestServices.GetRequiredService<PrincipalService>(); await principalService.InitAsync(context.Principal); } }; }, options => { Configuration.Bind("AzureAdB2COld", options); } ); // 配置新Instance认证 services.AddAuthentication() .AddMicrosoftIdentityWebApi("AzureAdB2CNewBearer", options => { Configuration.Bind("AzureAdB2CNew", options); options.TokenValidationParameters.NameClaimType = "email"; options.Events = new JwtBearerEvents() { OnTokenValidated = async (context) => { var principalService = context.HttpContext.RequestServices.GetRequiredService<PrincipalService>(); await principalService.InitAsync(context.Principal); } }; }, options => { Configuration.Bind("AzureAdB2CNew", options); } );
2. 添加策略方案作为默认认证入口
创建一个策略方案,设置为默认认证方案,让它根据令牌的签发者动态选择对应的认证方案:
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "AzureAdB2CMultiScheme"; options.DefaultChallengeScheme = "AzureAdB2CMultiScheme"; }) .AddPolicyScheme("AzureAdB2CMultiScheme", "Multi-Scheme B2C Authentication", options => { options.ForwardDefaultSelector = context => { var authorizationHeader = context.Request.Headers["Authorization"].FirstOrDefault(); if (!string.IsNullOrEmpty(authorizationHeader) && authorizationHeader.StartsWith("Bearer ")) { var token = authorizationHeader.Substring("Bearer ".Length).Trim(); var handler = new JwtSecurityTokenHandler(); if (handler.CanReadToken(token)) { var jwtToken = handler.ReadJwtToken(token); // 根据令牌的issuer判断使用哪个认证方案 if (jwtToken.Issuer.Contains("login.olddomain.com")) { return "AzureAdB2COldBearer"; } else if (jwtToken.Issuer.Contains("login.newdomain.com")) { return "AzureAdB2CNewBearer"; } } } // 默认优先尝试旧实例方案 return "AzureAdB2COldBearer"; }; });
关键说明
- 策略方案通过
ForwardDefaultSelector解析令牌的issuer字段,自动匹配对应的认证配置,确保令牌用正确的Instance验证。 - 两个实例的TokenValidationParameters会自动根据配置的Instance验证issuer,无需额外手动配置。
- 若无需动态判断,也可设置
ForwardAuthenticate为包含两个方案的列表,但动态匹配更高效。
内容的提问来源于stack exchange,提问作者Ole Albers
相关产品推荐
相关产品推荐

