Azure AD B2C多租户应用程序

时间:2016-03-05 12:51:45

标签: azure-active-directory azure-api-apps

我一直在努力将多租户api后端系统与多个B2C目录集成在一起,这个想法是每个租户都拥有并管理自己的目录,所以我们的api后端系统需要添加到每个租户b2C目录。

我正在考虑扩展此处所述的owin openID中间件。

Active Directory B2C and OpenIdConnectAuthenticationMiddleware - Multitenant systems

另一种方法是设置我们自己的B2C目录以集成我们租户的B2C目录。

这可能吗?

1 个答案:

答案 0 :(得分:2)

Azure Active Directory上下文中由OWIN OpenIDConnect中间件引用的客户端ID用于标识应用程序本身,无论租期如何。

对于多租户支持,如果您进入应用程序的“配置”部分,在用于应用程序开发的AD下,您应该注意到标签为“APPLICATION IS MULTI-TENANT”的选项,如屏幕截图所示。 Multi-Tenant Option

确保启用了多租户支持。在尝试启用该选项时,启用多租户支持还有其他要求。

此选项将允许其他租户的AAD同意使用您的应用程序。在行动中,一旦租户的AAD全球管理员同意,这实际上会将您在AAD中注册的应用程序的参考添加到他们的AAD,允许他们根据需要控制访问,而无需您做任何更改。

说到代码,您必须更改OWIN中间件以禁用发行方的自动验证,并实施您自己的机制来验证发行方(例如在租户初次注册时存储所有信息并检查所有未来的租户登录反对最初存储的信息)。如下:

            app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = ClientId,
                Authority = Authority,
                TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                {
                    // instead of using the default validation (validating against a single issuer value, as we do in line of business apps), 
                    // we inject our own multitenant validation logic
                    ValidateIssuer = false,
                },
                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    // we use this notification for injecting our custom logic
                    SecurityTokenValidated = (context) =>
                    {
                        // retriever caller data from the incoming principal
                        string issuer = context.AuthenticationTicket.Identity.FindFirst("iss").Value;
                        string UPN = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.Name).Value;
                        string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;

                        if (
                            // the caller comes from an admin-consented, recorded issuer
                            (db.Tenants.FirstOrDefault(a => ((a.IssValue == issuer) && (a.AdminConsented))) == null)
                            // the caller is recorded in the db of users who went through the individual onboardoing
                            && (db.Users.FirstOrDefault(b =>((b.UPN == UPN) && (b.TenantID == tenantID))) == null)
                            )
                            // the caller was neither from a trusted issuer or a registered user - throw to block the authentication flow
                            throw new SecurityTokenValidationException();                            
                        return Task.FromResult(0);
                    }
                }
            });

来源:https://github.com/Azure-Samples/active-directory-dotnet-webapp-multitenant-openidconnect/blob/master/TodoListWebApp/App_Start/Startup.Auth.cs

禁用颁发者验证的原因是由于在AAD的多租户应用程序中使用了公共网关,因此发行者会根据正在进行身份验证的租户进行更改。必须预先存放一些合适的发行人才能与之比较。