2016-03-05 202 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

這非常有幫助,非常感謝! –