はじめに
この記事に興味を持っていただきありがとうございます。Azure AD B2C のカスタムポリシーを探っていくシリーズ第 5 回です。前回はユーザージャーニーを作成する準備まで終わりました。今回はユーザージャーニーを作成します。
サインインユーザージャーニーを追加する
TrustFrameworkExtensions.xml
ファイルのUserJourneys
の下に、新たにUserJourney
を追加します。
<UserJourneys>
<UserJourney Id="AadSingleTenantSignin">
<OrchestrationSteps>
Id はAadSingleTenantSigninにしました。ここはなにかユニークな値であればよいです。
オーケストレーションステップ
OrchestrationStep
は 3 段階になります。
- ステップ 1: 認証プロバイダの選択
- ステップ 2: クレームの交換
- ステップ 3: クレームの出力
1 段階ずつ見てみます。
ステップ 1: 認証プロバイダの選択
ここでは AAD(OpenID Connect)と Facebook だけなので、タイプはClaimsProviderSelectionにします。ContentDefinitionReferenceId
もないとエラーになってしまうので、忘れずにつけます。
<OrchestrationStep Order="1" Type="ClaimsProviderSelection"
ContentDefinitionReferenceId="api.signuporsignin">
認証プロバイダを 2 つ用意します。TargetClaimsExchangeId
は、次のステップであるクレーム交換に用意するものと一致するようにします。
<ClaimsProviderSelection
TargetClaimsExchangeId="AadSingleTenantExchange" />
<ClaimsProviderSelection
TargetClaimsExchangeId="FacebookExchange" />
ステップ 2: クレームの交換
クレームの交換なので、タイプはClaimsExchangeにします。
<OrchestrationStep Order="2" Type="ClaimsExchange">
認証プロバイダの ID は、前のステップの認証プロバイダと一致させます。
<ClaimsExchange Id="AadSingleTenantExchange"
TechnicalProfileReferenceId="AAD-OIDC" />
<ClaimsExchange Id="FacebookExchange"
TechnicalProfileReferenceId="Facebook-OAUTH" />
ステップ 3: クレームの出力
クレームの出力なので、タイプはSendClaimsにします。
CpimIssuerTechnicalProfileReferenceId
も忘れずに指定します。これがないとトークンが作成されません。
<OrchestrationStep Order="3" Type="SendClaims"
CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
UserJourney 全体
まとめまして、全体はこのようになりました。
<UserJourneys>
<UserJourney Id="AadSingleTenantSignin">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsProviderSelection"
ContentDefinitionReferenceId="api.signuporsignin">
<ClaimsProviderSelections>
<ClaimsProviderSelection
TargetClaimsExchangeId="AadSingleTenantExchange" />
<ClaimsProviderSelection
TargetClaimsExchangeId="FacebookExchange" />
</ClaimsProviderSelections>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="AadSingleTenantExchange"
TechnicalProfileReferenceId="AAD-OIDC" />
<ClaimsExchange Id="FacebookExchange"
TechnicalProfileReferenceId="Facebook-OAUTH" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims"
CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
リライングパーティを作成する
ユーザージャーニーを作成しただけでは AD B2C で利用することはできず、リライングパーティを作成して使用するユーザージャーニーを指定してあげる必要があります。
カスタムポリシーでは、リライングパーティごとに XML ファイルを作成するのがお約束(?)のようですので、ここでも専用の XML ファイルを作成します。
まずは空の XML ファイルを作成しました。
<?xml version="1.0" encoding="utf-8"?>
<TrustFrameworkPolicy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06"
PolicySchemaVersion="0.3.0.0"
TenantId="tedblogb2c.onmicrosoft.com"
PolicyId="B2C_1A_Signin"
PublicPolicyUri="http://tedblogb2c.onmicrosoft.com/B2C_1A_Signin">
<BasePolicy>
<TenantId>tedblogb2c.onmicrosoft.com</TenantId>
<PolicyId>B2C_1A_TrustFrameworkExtensions</PolicyId>
</BasePolicy>
</TrustFrameworkPolicy>
TenantId
、PublicPolicyUri
、BasePolicy
を環境に合わせます。
ポリシー ID はB2C_1A_Signin
にしました。
リライングパーティを追加する
作成したファイルにRelyingParty
を追加します。
<RelyingParty>
<DefaultUserJourney ReferenceId="AadSingleTenantSignin" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" />
<OutputClaim ClaimTypeReferenceId="sub" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
ReferenceId
は、先に作成したユーザージャーニーに合わせます。
TechnicalProfile
は、アプリケーションに渡すクレームを指定しています。
完成したもの
作成した XML ファイルをTrustFrameworkBase.xml
、TrustFrameworkExtensions.xml
、Signin.xml
の順番に(順番大事!)アップロードしてお試し実行してみます。
最初に認証プロバイダの選択画面が表示されます。期待通りですね。
「My AAD Tenant」を選ぶと、いつもの見慣れた認証画面へ遷移します。
「Facebook」を選ぶと、Facebook へ遷移します。
取得されたトークン
id_token はこんな内容のものがとれました。内容いけてないですが、とりあえずよしとします。
{
"exp": 1624338757,
"nbf": 1624335157,
"ver": "1.0",
"iss": "https://tedblogb2c.b2clogin.com/ee5c034b-69f8-4495-887e-45a87e4af05a/v2.0/",
"sub": "Not supported currently. Use oid claim.",
"aud": "00000000-4444-5555-6666-777788889999",
"acr": "b2c_1a_signin",
"nonce": "38ac728c-8130-4be2-a096-1130d4e7fabc",
"iat": 1624335157,
"auth_time": 1624335156
}
トラブルシューティング
ADB2C がうまく動かないときにトラブルシューティングする方法のひとつは、Application Insights へログを送ることです(実際のログ内容は、解決策へたどり着くには足りないのですが、全くの五里霧中よりはよいかもしれません)。
Azure ポータル等で Application Insights を構成したら、InstrumentationKey をメモしておきます。
リライングパーティ用に新規作成した XML ファイルを編集します。
TrustFrameworkPolicy
要素に属性を 2 つDeploymentMode
とUserJourneyRecorderEndpoint
を追加します。
<TrustFrameworkPolicy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06"
PolicySchemaVersion="0.3.0.0"
TenantId="tedblogb2c.onmicrosoft.com"
PolicyId="B2C_1A_Signin"
PublicPolicyUri="http://tedblogb2c.onmicrosoft.com/B2C_1A_Signin"
DeploymentMode="Development"
UserJourneyRecorderEndpoint="urn:journeyrecorder:applicationinsights">
DeploymentMode
の値は、Development、Production、Debugging のいずれかになります。それぞれ多分文字通りの意味です。
RelyngParty
要素の下に、UserJourneyBehaviors
を追加します。
<RelyingParty>
<DefaultUserJourney ReferenceId="AadSingleTenantSignin" />
<UserJourneyBehaviors>
<JourneyInsights TelemetryEngine="ApplicationInsights"
InstrumentationKey="ApplicationInsightsのInstrumentationKey"
DeveloperMode="true"
ClientEnabled="false"
ServerEnabled="true"
TelemetryVersion="1.0.0" />
</UserJourneyBehaviors>
ClientEnabled
をtrueにすると、ブラウザ側(JavaScript 側)のログも記録されます。
編集したファイルをアップロードしてポリシーを上書きします。
まとめ
最後までご購読ありがとうございました。5 回に分けて Azure AD B2C カスタムポリシーについて調べてきました。自在にカスタムポリシーを作るには、まだまだ考慮しなければいけないことが多いです。もしまた機会があれば、ユーザージャーニーの実行条件、クレームの変換について調べ、ゲストでサインインする機能を作ってみたく思います。
~~~~~ ”Azure AD B2Cカスタムポリシーについて”【全5回】シリーズ ~~~~~
☆【第1回】Azure AD B2C カスタムポリシーについて
☆【第2回】テクニカルプロファイルとは
☆【第3回】ユーザージャーニーとは
☆【第4回】カスタムポリシーを作成してみる
☆【最終回】カスタムポリシーを作成してみる(2)
参考文献
- Introduction to Azure AD B2C custom policies
- Gaining Expertise with Azure AD B2C
- Policy schema reference manual
- Set up sign-in for a specific Azure Active Directory organization in Azure Active Directory B2C
- Troubleshoot Azure AD B2C custom policies
- Azure AD B2C Custom Policies - Introduction
- Azure AD B2C Custom Policies - Deep Dive on Custom Policy Schema