Azure Active Directory B2C 全域身分識別架構的概念證明,適用于以區域為基礎的設定
下一節說明如何建立區域架構協調流程的概念證明實作。 您可以 在這裡找到已完成的 Azure Active Directory B2C (Azure AD B2C) 自訂原則。
以區域為基礎的方法
每個區域 Azure AD B2C 租使用者都需要 Azure AD B2C 自訂原則,其中包含下列功能:
註冊旅程:
- 顯示畫面以收集使用者的使用者名稱、密碼和任何其他屬性
- 藉由查詢使用者區域對應資料表來防止註冊使用者已經存在
- 將使用者設定檔寫入本機租使用者
- 將使用者名稱對應寫入對應資料表
- 對應用程式發出權杖
登入旅程圖:
- 顯示使用者名稱和密碼畫面
- 執行使用者名稱查閱並傳回其區域
- 執行本機認證驗證或跨租使用者認證驗證
- 從本機租使用者或透過跨租使用者呼叫讀取使用者設定檔
- 對應用程式發出權杖
密碼重設旅程圖:
- 顯示畫面,以透過電子郵件 OTP 驗證使用者電子郵件
- 執行使用者名稱查閱並傳回其區域
- 顯示幕幕以擷取新密碼
- 將新密碼寫入本機租使用者,或透過跨租使用者呼叫
- 對應用程式發出權杖
下列區塊圖顯示概念證明。 本指南將示範如何設定 Azure AD B2C 租使用者。 本指南不包含外部 API 層和異地分散式查閱表格。
必要條件
準備儲存層
您將需要儲存層,其可以儲存使用者電子郵件、objectId 和區域。 這可讓您追蹤和查詢使用者註冊的位置。 您可以使用 Azure 儲存體資料表 來保存此資料。
準備您的 API 層
在概念證明中,有多個 API 可用來示範以區域為基礎的方法。
確認使用者是否已存在
註冊期間會使用 API 來判斷使用者是否已存在於任何區域中。
要求如下所示:
POST /doesUserExistInLookupTable HTTP/1.1
Host: yourapi.com
Content-Type: application/json
{
email: bob@contoso.com
}
如果使用者不存在,回應應該是 HTTP 200。
如果使用者存在,回應應為 HTTP 409。
記錄使用者區域對應
註冊期間會使用 API 來記錄使用者已註冊的區域。
要求如下所示:
POST /userToRegionLookup HTTP/1.1
Host: yourapi.com
Authorization Bearer: <token>
Content-Type: application/json
{
"email": "bob@contoso.com"
}
如果使用者存在,回應應該是 HTTP 200。
如果使用者存在,回應應為 HTTP 409。
傳回使用者所在的區域
登入期間會使用 API 來判斷使用者已註冊的區域。 這表示是否需要執行跨租使用者驗證。
要求如下所示:
POST /userToRegionLookup HTTP/1.1
Host: yourapi.com
Authorization Bearer: <token>
Content-Type: application/json
{
"email": "bob@contoso.com"
}
回應應該是具有使用者已註冊區域和 objectId 的 HTTP 200。
{
"objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
"region": "APAC"
}
如果使用者不存在或遇到錯誤,API 應該會以 HTTP 409 回應。
跨租使用者寫入密碼
在密碼重設流程期間,會使用 API,在他們重設其密碼的不同區域中撰寫新密碼。
要求如下所示:
POST /writePasswordCrossTenant HTTP/1.1
Host: yourapi.com
Authorization Bearer: <token>
Content-Type: application/json
{
"objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
"password": "some!strong123STRING"
}
如果進程成功,回應應該是 HTTP 200,如果發生錯誤,則為 HTTP 409。
以區域為基礎的 Azure AD B2C 設定
下列各節會準備 Azure AD B2C 租使用者,以追蹤使用者註冊並視需要執行跨租使用者驗證或密碼重設的區域。
註冊自訂原則設定
在註冊期間,我們必須確定檢查使用者不存在於任何其他租使用者中,並將使用者使用者區域對應寫入外部資料表。
LocalAccountSignUpWithLogonEmail
修改 Azure AD B2C 入門套件中的技術設定檔,如下所示:
<TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
...
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="REST-getTokenforExternalApiCalls" />
<ValidationTechnicalProfile ReferenceId="REST-doesUserExistInLookupTable" />
<ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail" />
<ValidationTechnicalProfile ReferenceId="REST-writeUserToRegionMapping" />
</ValidationTechnicalProfiles>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>
ValidationTechnicalProfiles會執行下列邏輯:
取得權杖,以使用
REST-getTokenforExternalApiCalls
技術設定檔呼叫受保護的 API 端點。- 請遵循這裡的檔,以使用Microsoft Entra持有人權杖來取得和保護 API。
確認使用者是否已透過您受保護的外部 REST API 端點存在於使用者區域對應中:
此 API 呼叫會在所有註冊之前進行,請務必確定此 API 具有適當的負載平衡、復原和容錯移轉機制,以符合執行時間需求。
透過外部 REST API 查詢使用者區域對應的技術設定檔範例如下:
<TechnicalProfile Id="REST-doesUserExistInLookupTable "> <DisplayName>User to Region lookup</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://myApi.com/doesUserExistInLookupTable</Item> <Item Key="AuthenticationType">Bearer</Item> <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="AllowInsecureAuthInProduction">false</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" /> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" /> </InputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
如果使用者存在,此 API 應該以 HTTP 409 回應,並顯示適當的錯誤訊息。 否則,如果使用者不存在,請以 HTTP 200 回應。
透過受保護的外部 REST API 端點撰寫使用者區域對應
此 API 呼叫會在所有註冊之前進行,請務必確定此 API 具有適當的負載平衡、復原和容錯移轉機制,以符合執行時間需求。
透過外部 REST API 撰寫使用者區域對應的技術設定檔範例如下:
<TechnicalProfile Id="REST-writeUserToRegionMapping"> <DisplayName>User to Region lookup</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://myApi.com/writeUserToRegionMapping</Item> <Item Key="AuthenticationType">Bearer</Item> <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="AllowInsecureAuthInProduction">false</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" /> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" /> <InputClaim ClaimTypeReferenceId="region" DefaultValue="EMEA" /> <InputClaim ClaimTypeReferenceId="objectId" /> </InputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile> ```
登入自訂原則設定
在登入期間,我們必須判斷使用者設定檔位置,並針對其設定檔所在的 Azure AD B2C 租使用者進行驗證。
SelfAsserted-LocalAccountSignin-Email
修改 Azure AD B2C 入門套件中的技術設定檔,以執行使用者區域查閱,並在使用者從不同區域到他們到達的租使用者區域時執行跨租使用者驗證。
ValidationTechnicalProfiles
將 更新為:
<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email">
...
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="REST-getTokenforExternalApiCalls" />
<ValidationTechnicalProfile ReferenceId="REST-regionLookup" />
<ValidationTechnicalProfile ReferenceId="login-NonInteractive">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="false">
<Value>user_region</Value>
<Value>EMEA</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
<ValidationTechnicalProfile ReferenceId="REST-login-NonInteractive-APAC">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="false">
<Value>user_region</Value>
<Value>APAC</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
<ValidationTechnicalProfile ReferenceId="REST-fetchUserProfile-APAC">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="false">
<Value>user_region</Value>
<Value>APAC</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
</ValidationTechnicalProfiles>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>
ValidationTechnicalProfiles會在使用者提交其認證時執行下列邏輯:
取得權杖,以使用
REST-getTokenforExternalApiCalls
技術設定檔呼叫受保護的 API 端點。- 請遵循這裡的檔,以使用Microsoft Entra持有人權杖來取得和保護 API。
透過受保護的外部 REST API 端點查閱使用者區域對應
此 API 呼叫會在所有註冊之前進行,請務必確定此 API 具有適當的負載平衡、復原和容錯移轉機制,以符合執行時間需求。
透過外部 REST API 查詢使用者區域對應的技術設定檔範例如下:
<TechnicalProfile Id="REST-regionLookup"> <DisplayName>User to Region lookup</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://myApi.com/userToRegionLookup</Item> <Item Key="AuthenticationType">Bearer</Item> <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="AllowInsecureAuthInProduction">false</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" /> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="user_region" PartnerClaimType="region" /> <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="objectId" /> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
針對在此租使用者中註冊的使用者,
login-NonInteractive
透過技術設定檔執行本機帳戶驗證。 這是在 Azure AD B2C 入門套件中找到的預設技術設定檔。有條件地透過每個個別區域的技術設定檔執行跨租使用者驗證
REST-login-NonInteractive-[region]
。這也會從使用者主租使用者取得 MS 圖形 API 權杖。 在每個區域租使用者中註冊原生應用程式註冊,並具有 MS 圖形 API 的許可權,以取得委派的許可權
user.read
。透過外部 REST API 執行使用者區域對應的技術設定檔範例如下:
<TechnicalProfile Id="REST-login-NonInteractive-APAC"> <DisplayName>non interactive authentication to APAC</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://login.microsoftonline.com/yourAPACb2ctenant.onmicrosoft.com/oauth2/v2.0/token</Item> <Item Key="AuthenticationType">None</Item> <Item Key="SendClaimsIn">Form</Item> <Item Key="AllowInsecureAuthInProduction">true</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="apac_client_id" PartnerClaimType="client_id" DefaultValue="00001111-aaaa-2222-bbbb-3333cccc4444" /> <InputClaim ClaimTypeReferenceId="ropc_grant_type" PartnerClaimType="grant_type" DefaultValue="password" /> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="username" /> <InputClaim ClaimTypeReferenceId="password" /> <InputClaim ClaimTypeReferenceId="scope" DefaultValue="https://graph.microsoft.com/.default" AlwaysUseDefaultValue="true" /> <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="ext_Api_bearerToken" PartnerClaimType="access_token" /> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
將 中的
ServiceUrl
取代<yourb2ctenant>
為您需要以驗證為目標的租使用者。使用應用程式註冊
ApplicationId
來填入DefaultValue
輸入宣告的apac_client_id
。
有條件地,透過每個個別區域的技術設定檔,使用跨租使用者 REST API 呼叫
REST-fetchUserProfile-[region]
來擷取使用者設定檔。透過 MS 圖形 API 讀取使用者設定檔的範例技術設定檔如下所示:
<TechnicalProfile Id="REST-fetchUserProfile-APAC"> <DisplayName>fetch user profile cross tenant</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://graph.microsoft.com/beta/me</Item> <Item Key="AuthenticationType">Bearer</Item> <Item Key="UseClaimAsBearerToken">graph_bearerToken</Item> <Item Key="SendClaimsIn">Body</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="graph_bearerToken" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="id" /> <OutputClaim ClaimTypeReferenceId="givenName" /> <OutputClaim ClaimTypeReferenceId="surName" /> <OutputClaim ClaimTypeReferenceId="displayName" /> <OutputClaim ClaimTypeReferenceId="userPrincipalName" PartnerClaimType="upn" /> <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localAccountAuthentication" /> </OutputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>
密碼重設自訂原則設定
在密碼重設期間,我們必須判斷使用者設定檔位置,並針對使用者設定檔所在的 Azure AD B2C 租使用者更新密碼。
LocalAccountSignUpWithLogonEmail
修改 Azure AD B2C 入門套件中的技術設定檔,以執行使用者使用者區域查閱,並更新個別租使用者中的密碼。
ValidationTechnicalProfiles
將 更新為:
<TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
<OutputClaims>
...
<OutputClaim ClaimTypeReferenceId="ext_Api_bearerToken" DefaultValue="EMEA"/>
</OutputClaims>
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="REST-getTokenforExternalApiCalls">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="true">
<Value>user_region</Value>
<Value>EMEA</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
<ValidationTechnicalProfile ReferenceId="REST-regionLookup" />
<ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
</ValidationTechnicalProfiles>
</TechnicalProfile>
當使用者提交已驗證的電子郵件以更新其密碼時, ValidationTechnicalProfiles 將會執行下列邏輯:
取得權杖以呼叫受保護的 API 端點
透過受保護的外部 REST API 端點查閱使用者區域對應
- 此 API 呼叫會在所有密碼重設嘗試之前進行,請務必確定此 API 具有適當的負載平衡、復原和容錯移轉機制,以符合執行時間需求。
LocalAccountWritePasswordUsingObjectId
修改技術設定檔,以將新密碼寫入本機租使用者,或有條件地寫入跨區域租使用者。
<TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId">
...
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="AAD-UserWritePasswordUsingObjectId">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="false">
<Value>user_region</Value>
<Value>EMEA</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
<ValidationTechnicalProfile ReferenceId="REST-UserWritePasswordUsingObjectId-APAC">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="false">
<Value>user_region</Value>
<Value>APAC</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
</ValidationTechnicalProfiles>
</TechnicalProfile>
ValidationTechnicalProfiles會在使用者提交新密碼時執行下列邏輯:
如果使用者存在於 EMEA 租使用者中, (此租使用者) ,請寫入目錄的新密碼。
有條件地,使用 REST API 呼叫,將新的密碼寫入使用者設定檔所在的區域中。
<TechnicalProfile Id="REST-UserWritePasswordUsingObjectId-APAC"> <DisplayName>Write password to APAC tenant</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ServiceUrl">https://myApi.com/writePasswordCrossTenant</Item> <Item Key="AuthenticationType">Bearer</Item> <Item Key="UseClaimAsBearerToken">ext_Api_bearerToken</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="DebugMode">true</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="ext_Api_bearerToken" /> <InputClaim ClaimTypeReferenceId="objectId" /> <InputClaim ClaimTypeReferenceId="newPassword" /> </InputClaims> <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" /> </TechnicalProfile>