Von Bedeutung
2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください。
次のセクションでは、リージョンベースのオーケストレーションの概念実証の実装を作成する方法について説明します。 完成した Azure Active Directory B2C (Azure AD B2C) カスタム ポリシーについては、 こちらをご覧ください。
地域ベースのアプローチ
各リージョンの Azure AD B2C テナントには、次の機能を含む Azure AD B2C カスタム ポリシーが必要です。
サインアップの旅:
- ユーザーのユーザー名、パスワード、およびその他の属性を収集するための画面を表示します
- ユーザーが既に存在する場合は、ユーザーとリージョンのマッピング テーブルをクエリしてサインアップを防止します
- ユーザープロファイルをローカルテナントに書き込みます
- ユーザーのユーザー名から地域へのマッピングをマッピングテーブルに書き込みます
- アプリケーションにトークンを発行する
サインインの旅:
- ユーザ名とパスワードの画面を表示する
- ユーザー名の検索を実行し、その地域を返します
- ローカル資格情報の検証またはテナント間の資格情報の検証を実行する
- ローカル テナントから、またはテナント間呼び出しを介してユーザー プロファイルを読み取ります
- アプリケーションにトークンを発行する
パスワード リセットの旅:
- ユーザーのメールをメールOTPで検証する画面を表示する
- ユーザー名の検索を実行し、その地域を返します
- 新しいパスワードを取得するための画面を表示する
- 新しいパスワードをローカル テナントに書き込むか、テナント間の呼び出しを介して書き込みます
- アプリケーションにトークンを発行する
次のブロック図は、概念実証を示しています。 このガイダンスでは、Azure AD B2C テナントを構成する方法について説明します。 外部 API レイヤーと Geo 分散参照テーブルは、このガイドの一部として含まれていません。
[前提条件]
ビジネスでサポートが必要なリージョンごとにテナントを作成します。 この概念実証には、少なくとも 2 つのテナントが必要です。
カスタム ポリシー をテナントにデプロイします。
ストレージレイヤーを準備する
ユーザーのメール、objectId、およびリージョンを保存できるストレージレイヤーが必要になります。 これにより、ユーザーがサインアップした場所を追跡し、クエリを実行できるようになります。 Azure Storage テーブルを使用して、このデータを保持できます。
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 テナントを準備します。
カスタムポリシー構成にサインアップする
サインアップ時には、ユーザーが他のテナントに存在しないことを確認し、ユーザーのユーザーとリージョンのマッピングを外部テーブルに書き込む必要があります。
Azure AD B2C スターター パックの LocalAccountSignUpWithLogonEmail
技術プロファイルの変更は次のとおりです。
<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 テナントに対してユーザーを認証する必要があります。
Azure AD B2C スターター パックの SelfAsserted-LocalAccountSignin-Email
技術プロファイルを変更して、ユーザー リージョンの検索を実行し、ユーザーが到達したテナントとは異なるリージョンから来ている場合はテナント間認証を実行します。
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 Graph API トークンも取得されます。 委任されたアクセス許可のMS Graph 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>
<yourb2ctenant>
内のServiceUrl
を、認証の対象にする必要があるテナントに置き換えます。アプリケーション登録
ApplicationId
を使用して、DefaultValue
入力要求のapac_client_id
を設定します。
条件付きで、各リージョンの
REST-fetchUserProfile-[region]
技術プロファイルを介してクロステナントREST API呼び出しを使用して、ユーザープロファイルをフェッチします。MS Graph 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 テナントに対してパスワードを更新する必要があります。
Azure AD B2C スターター パックの LocalAccountSignUpWithLogonEmail
技術プロファイルを変更して、ユーザー ユーザー リージョンの検索を実行し、それぞれのテナントのパスワードを更新します。
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>