2016-03-05 329 views
1

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

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

Active Directory B2C and OpenIdConnectAuthenticationMiddleware - Multitenant systems

另一种方法是建立自己的B2C目录集成了我们租户的B2C目录。

这可能吗?

回答

2

OWIN OpenIDConnect中间件在Azure Active Directory环境中引用的客户端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多租户应用中使用,因此基于该租户多数民众赞成验证发行人的变化。事先必须有一些适当的发行商存储与之比较。

+0

这非常有帮助,非常感谢! –

相关问题