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

如何同时配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:40:30