与多个 B2C 租户共享单个 WebApp 和 API 部署

Kaf*_*Kaf 5 multi-tenant asp.net-web-api owin-middleware openid-connect azure-ad-b2c

当前场景: Web App 和 Web API 使用 AAD B2C 进行身份验证并且工作正常。每个客户都有一个唯一的租户。OpenIdConnectAuthenticationOptions(web app) 和 OAuthBearerAuthenticationOptions(api) 在应用程序中设置Startup

如此处所述:使用 Azure AD B2C 对 Web 应用程序和 Web API 进行基于令牌的身份验证

不幸的是,必须为每个客户部署 Web 应用程序和 API,以将它们分开。

要求: 为多个客户使用相同的 Web 应用程序和 API,而不是为每个客户部署它们。每个客户都有不同的 Web 应用程序 URL。

在此处输入图片说明

问题 1(Web 应用程序):如何根据请求 URL 将(用于身份验证)用户重定向到正确的租户?

OpenIdConnectAuthenticationOptions基于Request.Url应用程序而不是应用程序从数据库(或内存)动态设置(租户、应用程序ID、signInPolicy 等)Startup

问题 2(API):如何使用正确的租户验证收到的令牌?

OAuthBearerAuthenticationOptions根据收到的令牌 clientId 即时设置配置,而不是在应用程序中Startup

Kaf*_*Kaf 1

根据 @ManishJoisar 的请求,这就是我很久以前解决问题的方法。这是旧的 .net Framework 4.8 代码示例。

请注意,如今,B2C v2 策略通过自定义策略提供了更好的联合实施。

public void ConfigureAuth(IAppBuilder app)
    {

        int index = 2000;
        foreach (var record in SystemConfig.ApiToWebUrl)
        {
            app.MapWhen(
                    context => System.Web.HttpContext.Current.Request.Url.BaseURL() == record.Key,
                    config =>
                    {
                        var customer = SystemConfig.GetWebSettings(true)[record.Value];
                        config.UseOAuthBearerAuthentication(CreateBearerOptionsFromPolicy(index, customer.B2CSignInPolicyId,
                                                customer.B2CAadInstance, customer.B2CTenant, customer.B2CApplicationId));
                    }
                );

            index++;
        }
    }

    public OAuthBearerAuthenticationOptions CreateBearerOptionsFromPolicy(int index, string b2cPlicyName,
                    string b2cInstance, string b2cTenant, string b2cClientId)
    {
        TokenValidationParameters tvps = new TokenValidationParameters
        {
            // This is where you specify that your API only accepts tokens from its own clients
            ValidAudience = b2cClientId,
            AuthenticationType = string.Format("{0}_{1}", b2cPlicyName, index)
        };

        var aadInstance = string.Format("https://{0}{1}", b2cTenant.Split('.')[0], ".b2clogin.com/{0}/{1}/v2.0/.well-known/openid-configuration");

        var config = String.Format(aadInstance, b2cTenant, b2cPlicyName);

        return new OAuthBearerAuthenticationOptions
        {
            // This SecurityTokenProvider fetches the Azure AD B2C metadata & signing keys from the OpenIDConnect metadata endpoint
            AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider(config)),
            Provider = new CustomOAuthBearerProvider()
        };
    }
Run Code Online (Sandbox Code Playgroud)