重要
2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください。
このサンプル記事では、Azure Active Directory B2C (Azure AD B2C) 認証を Deduce と統合する方法に関するガイダンスを提供します。 Deduce は、アカウントの引き継ぎと登録の不正行為 (インターネット上で最も急速に成長している詐欺) の停止に重点を置いています。 Deduce Identity Network は、1 日に 14 億回を超えるログイン、登録、チェックアウトを Deduce と共有する 150,000 を超える Web サイトとアプリの連合によって強化されています。
結果として得られる ID インテリジェンスは、財務上の問題と企業の責任になる前に攻撃を停止します。 過去の行動分析を信頼の予測器として使用するため、組織は最高の顧客に摩擦のないユーザー エクスペリエンスを提供できます。 信頼性とリスクのシグナルの幅広い範囲が、Azure AD B2C インスタンスを通じてすべての認証決定に情報を提供できます。 この統合により、組織はサインアップまたはサインイン プロセス中に Azure AD B2C 機能を拡張して、Deduce Insights API からユーザーに関する追加の分析情報を取得できます。 Deduce API によって取り込まれる属性の一部は次のとおりです。
- 電子メール
- IP アドレス
- ユーザー エージェント
[前提条件]
作業を開始するには、以下が必要です。
Azure サブスクリプション。 お持ちでない場合は、 無料アカウントを入手してください。
Azure サブスクリプションにリンクされている Azure AD B2C テナント 。
テスト環境または運用環境を構成するには、Deduce にお問い合わせください。
Azure AD B2C カスタム ポリシーを使用する機能。 できない場合は、「 Azure AD B2C のカスタム ポリシーの概要 」の手順を完了して、カスタム ポリシーの使用方法を確認してください。
シナリオの説明
統合には、次のコンポーネントが含まれています。
- Azure AD B2C – ユーザーの資格情報の検証を担当する承認サーバー (ID プロバイダーとも呼ばれます)。
- Deduce – Deduce サービスは、ユーザーから提供された入力を受け取り、ユーザーの ID に関するデジタル アクティビティの分析情報を提供します。
- カスタム rest API – この API は、Azure AD B2C と Deduce Insights API の間の統合を実装します。
次のアーキテクチャ図は、実装を示しています。
ステップス | 説明 |
---|---|
1. | ユーザーが Azure AD B2C のサインイン ページを開き、ユーザー名を入力してサインインまたはサインアップします。 |
2. | Azure AD B2C は中間層 API を呼び出し、ユーザー属性を渡します。 |
3. | 中間層 API は、ユーザー属性を収集し、Deduce API が使用できる形式に変換し、それを Deduce に送信します。 |
4. | Deduce は情報を使用し、それを処理して、リスク分析に基づいてユーザー識別を検証します。 次に、結果を中間層 API に返します。 |
5 | 中間層 API は情報を処理し、リスク、信頼、情報のシグナルを正しい JSON 形式で Azure AD B2C に返します。 |
6. | Azure AD B2C は、中間層 API から情報を受信します。 エラー応答が表示された場合は、エラー メッセージがユーザーに表示されます。 成功応答が表示された場合、ユーザーは認証され、ディレクトリに書き込まれます。 |
Deduce を使用してオンボードする
Deduce アカウントを作成するには、 Deduce サポートにお問い合わせください。 アカウントが作成されると、API 構成に必要な サイト ID と API キー が届きます。
次のセクションでは、統合プロセスについて説明します。
手順 1: Azure AD B2C ポリシーを構成する
「スターター パックを入手する」の手順に従って、Azure AD B2C テナントを設定し、ポリシーを構成する方法を確認します。 このサンプル記事は、ローカル アカウント スターター パックに基づいています。
手順 2: Azure AD B2C ユーザー インターフェイスをカスタマイズする
クライアント側からuser_agentを収集するには、任意の ID を使用して独自の **ContentDefinition**
を作成し、関連する JavaScript を含めます。 エンド ユーザー ブラウザーのuser_agent文字列を特定し、それを要求として Azure AD B2C に格納します。
api.selfasserted、 selfAsserted.cshtml をローカルにダウンロードします。
selfAsserted.cshtml を編集して、
</head>
を閉じる前に次の JavaScript を挿入すると、panel-default を非表示にする追加の Style 要素を定義できます。<style> .panel-default { margin: 0 auto; width: 60%; height: 0px; background-color: #296ec6; opacity: 1; border-radius: .5rem; border: none; color: #fff; font-size: 1em; box-shadow: 0 0 30px 0 #dae1f7; visibility: hidden; } </style>
</body>
の終了前に、次の JavaScript コードを追加します。 このコードは、ユーザーのブラウザーからuser_agentを読み取り、ContentDefinition をセルフアサート技術プロファイルと組み合わせて使用して、次のオーケストレーション手順に出力要求としてuser_agentを返します。<script> $("#user_agent").hide().val(window.navigator.userAgent); var img = new Image(); img.onload = function() { document.getElementById("continue").click(); }; img.src = "https://login.microsoftonline.com/static/tenant/templates/images/logo.svg"; </script>
手順 3: ストレージの場所を構成する
ストレージ アカウントに BLOB ストレージ コンテナーを設定し、以前に編集した
**selfAsserted.cshtml**
ファイルを BLOB コンテナーにアップロードします。次の手順に従って、作成したストレージ コンテナーへの CORS アクセスを許可します。
[設定]>[許可されたオリジン]に移動し、「
https://your_tenant_name.b2clogin.com
」と入力します。your-tenant- name
を、fabrikam
などの Azure AD B2C テナントの名前に置き換えます。 テナント名を入力するときは、すべて小文字を使用します。[許可されるメソッド] で、
GET
とPUT
を選択します。保存 を選択します。
手順 4: コンテンツ定義を構成する
ユーザー インターフェイスをカスタマイズするには、カスタマイズされた HTML コンテンツを含む ContentDefinition
要素に URL を指定します。 自己主張型技術プロファイルまたはオーケストレーションのステップで、そのコンテンツ定義識別子を参照します。
TrustFrameworksExtension.xml
を開き、新しい ContentDefinition を定義してセルフアサート技術プロファイルをカスタマイズします。BuildingBlocks
要素を見つけて、**api.selfassertedDeduce**
ContentDefinition を追加します。<BuildingBlocks> ... <ContentDefinitions> <ContentDefinition Id="api.selfassertedDeduce"> <LoadUri>https://<STORAGE-ACCOUNT-NAME>.blob.core.windows.net/<CONTAINER>/selfAsserted.cshtml</LoadUri> <RecoveryUri>~/common/default_page_error.html</RecoveryUri> <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.7</DataUri> <Metadata> <Item Key="DisplayName">Signin and Signup Deduce</Item> </Metadata> </ContentDefinition> </ContentDefinitions> ... </BuildingBlocks>
LoadUri を、selfAsserted.cshtml
で作成した ファイルを指す URL に置き換えます。
手順 5: Deduce の ClaimType を追加する
ClaimsSchema要素は、ポリシーの一部として参照可能な要求の種類を定義します。 Deduce がサポートしており、それを追加することができるクレームが他にもあります。
TrustFrameworksExtension.xml
を開きます。**BuildingBlocks**
要素では、Deduce がサポートする追加の ID 要求を追加できます。<BuildingBlocks> ... <ClaimsSchema> <!-- Claims for Deduce API request body --> <ClaimType Id="site"> <DisplayName>Site ID</DisplayName> <DataType>string</DataType> <AdminHelpText>Deduce Insight API site id</AdminHelpText> </ClaimType> <ClaimType Id="ip"> <DisplayName>IP Address</DisplayName> <DataType>string</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="apikey"> <DisplayName>API Key</DisplayName> <DataType>string</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="action"> <DisplayName>Contextual action</DisplayName> <DataType>string</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <!-- End of Claims for Deduce API request body --> <!-- Rest API call request body to deduce insight API --> <ClaimType Id="deduce_requestbody"> <DisplayName>Request body for insight api</DisplayName> <DataType>string</DataType> <AdminHelpText>Request body for insight api</AdminHelpText> </ClaimType> <ClaimType Id="deduce_trust_response"> <DisplayName>Response body for insight api</DisplayName> <DataType>string</DataType> <AdminHelpText>Response body for insight api</AdminHelpText> </ClaimType> <!-- End of Rest API call request body to deduce insight API --> <!-- Response claims from Deduce Insight API --> <ClaimType Id="data.signals.trust"> <DisplayName>Trust collection</DisplayName> <DataType>stringCollection</DataType> <AdminHelpText>List of asserted trust</AdminHelpText> </ClaimType> <ClaimType Id="data.signals.info"> <DisplayName>Trust collection</DisplayName> <DataType>stringCollection</DataType> <AdminHelpText>List of asserted info</AdminHelpText> </ClaimType> <ClaimType Id="data.signals.risk"> <DisplayName>Trust collection</DisplayName> <DataType>stringCollection</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.company_name"> <DisplayName>data.network.company_name</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.crawler_name"> <DisplayName>data.network.crawler_name</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_corporate"> <DisplayName>data.network.is_corporate</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_education"> <DisplayName>data.network.is_education</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_hosting"> <DisplayName>data.network.is_hosting</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_mobile"> <DisplayName>data.network.is_mobile</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_proxy"> <DisplayName>data.network.is_proxy"</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_tor"> <DisplayName>data.network.is_tor</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_vpn_capable"> <DisplayName>data.network.is_vpn_capable</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_vpn_confirmed"> <DisplayName>data.network.is_vpn_confirmed</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.is_vpn_suspect"> <DisplayName>data.network.is_vpn_suspect</DisplayName> <DataType>boolean</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.isp_name"> <DisplayName>data.network.isp_name</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.network.vpn_name"> <DisplayName>data.network.vpn_name</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.geo.city"> <DisplayName>data.geo.city</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.geo.country"> <DisplayName>data.geo.country</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.geo.lat"> <DisplayName>data.geo.lat</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.geo.long"> <DisplayName>data.geo.long</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.geo.state"> <DisplayName>data.geo.state</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.device.ua_brand"> <DisplayName>data.device.ua_brand</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.device.ua_browser"> <DisplayName>data.device.ua_browser</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.device.ua_device_type"> <DisplayName>data.device.ua_device_type</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.device.ua_name"> <DisplayName>data.device.ua_name</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.device.ua_os"> <DisplayName>data.device.ua_os</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.device.ua_type"> <DisplayName>data.device.ua_type</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.device.ua_version"> <DisplayName>data.device.ua_version</DisplayName> <DataType>string</DataType> <AdminHelpText>List of asserted risk</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.email.ip_count"> <DisplayName>data.activity.email.ip_count</DisplayName> <DataType>int</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.email.lastseen"> <DisplayName>data.activity.email.lastseen</DisplayName> <DataType>string</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.email.frequency"> <DisplayName>data.activity.email.frequency</DisplayName> <DataType>int</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.emailip.frequency"> <DisplayName>data.activity.emailip.frequency</DisplayName> <DataType>int</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.emailip.lastseen"> <DisplayName>data.activity.emailip.lastseen</DisplayName> <DataType>string</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.emailip.match"> <DisplayName>data.activity.emailip.match</DisplayName> <DataType>boolean</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.emailip.rank_email"> <DisplayName>data.activity.emailip.rank_email</DisplayName> <DataType>int</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.emailip.rank_ip"> <DisplayName>data.activity.emailip.rank_ip</DisplayName> <DataType>int</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.ip.email_count"> <DisplayName>data.activity.ip.email_count</DisplayName> <DataType>int</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.ip.lastseen"> <DisplayName>data.activity.ip.lastseen</DisplayName> <DataType>string</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.activity.ip.frequency"> <DisplayName>data.activity.ip.frequency</DisplayName> <DataType>int</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="data.sent_timestamp"> <DisplayName>datasent_timestamp</DisplayName> <DataType>long</DataType> <AdminHelpText>Add help text here</AdminHelpText> </ClaimType> <ClaimType Id="user_agent"> <DisplayName>User Agent</DisplayName> <DataType>string</DataType> <UserHelpText>Add help text here</UserHelpText> <UserInputType>TextBox</UserInputType> </ClaimType> <ClaimType Id="correlationId"> <DisplayName>correlation ID</DisplayName> <DataType>string</DataType> </ClaimType> <!-- End Response claims from Deduce Insight API --> ... </ClaimsSchema> ... </BuildingBlocks>
手順 6: Deduce ClaimsProvider を追加する
クレーム プロバイダーは、技術プロファイルを介してさまざまな種類のパーティと通信するためのインターフェイスです。
SelfAsserted-UserAgent
セルフアサート技術プロファイルは、クライアント側からuser_agentを収集するために使用されます。deduce_insight_api
技術プロファイルは、入力要求コレクション内の Deduce RESTful サービスにデータを送信し、出力要求コレクションでデータを受信します。 詳細については、REST API 要求交換を Azure AD B2C カスタム ポリシーに統合する方法に関するページを参照してください。
Deduce をクレーム プロバイダーとして定義するには、ポリシーの拡張ファイルの ClaimsProvider 要素に追加します。
TrustFrameworkExtensions.xml
を開きます。ClaimsProvider 要素を検索します。 存在しない場合は、次のように新しい ClaimsProvider を追加します。
<ClaimsProvider> <DisplayName>Deduce REST API</DisplayName> <TechnicalProfiles> <TechnicalProfile Id="SelfAsserted-UserAgent"> <DisplayName>Pre-login</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="ContentDefinitionReferenceId">api.selfassertedDeduce</Item> <Item Key="setting.showCancelButton">false</Item> <Item Key="language.button_continue">Continue</Item> </Metadata> <OutputClaims> <OutputClaim ClaimTypeReferenceId="user_agent" /> </OutputClaims> </TechnicalProfile> <TechnicalProfile Id="deduce_insight_api"> <DisplayName>Get customer insight data from deduce api</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://deduceproxyapi.azurewebsites.net/api/Deduce/DeduceInsights</Item> <Item Key="AuthenticationType">None</Item> <Item Key="SendClaimsIn">Body</Item> <Item Key="ResolveJsonPathsInJsonTokens">true</Item> <Item Key="AllowInsecureAuthInProduction">true</Item> <Item Key="DebugMode">true</Item> <Item Key="IncludeClaimResolvingInClaimsHandling">true</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="user_agent" /> <InputClaim ClaimTypeReferenceId="signInNames.emailAddress" PartnerClaimType="email" /> <InputClaim ClaimTypeReferenceId="ip" DefaultValue="{Context:IPAddress}" AlwaysUseDefaultValue="true" /> <InputClaim ClaimTypeReferenceId="apikey" DefaultValue="<DEDUCE API KEY>" /> <InputClaim ClaimTypeReferenceId="action" DefaultValue="auth.success.password" /> <InputClaim ClaimTypeReferenceId="site" DefaultValue="<SITE>" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="data.sent_timestamp" PartnerClaimType="data.sent_timestamp" /> <OutputClaim ClaimTypeReferenceId="data.activity.ip.frequency" PartnerClaimType="data.activity.ip.frequency" /> <OutputClaim ClaimTypeReferenceId="data.activity.ip.lastseen" PartnerClaimType="data.activity.ip.lastseen" /> <OutputClaim ClaimTypeReferenceId="data.activity.ip.email_count" PartnerClaimType="data.activity.ip.email_count" /> <OutputClaim ClaimTypeReferenceId="data.activity.email.ip_count" PartnerClaimType="data.activity.email.ip_count" /> <OutputClaim ClaimTypeReferenceId="data.activity.email.lastseen" PartnerClaimType="data.activity.email.lastseen" /> <OutputClaim ClaimTypeReferenceId="data.activity.email.frequency" PartnerClaimType="data.activity.email.frequency" /> <OutputClaim ClaimTypeReferenceId="data.activity.emailip.frequency" PartnerClaimType="data.activity.emailip.frequency" /> <OutputClaim ClaimTypeReferenceId="data.activity.emailip.lastseen" PartnerClaimType="data.activity.emailip.lastseen" /> <OutputClaim ClaimTypeReferenceId="data.activity.emailip.match" PartnerClaimType="data.activity.emailip.match" /> <OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_email" PartnerClaimType="data.activity.emailip.rank_email" /> <OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_ip" PartnerClaimType="data.activity.emailip.rank_ip" /> <OutputClaim ClaimTypeReferenceId="data.signals.trust" PartnerClaimType="data.signals.trust" /> <OutputClaim ClaimTypeReferenceId="data.signals.info" PartnerClaimType="data.signals.info" /> <OutputClaim ClaimTypeReferenceId="data.signals.risk" PartnerClaimType="data.signals.risk" /> <OutputClaim ClaimTypeReferenceId="data.network.company_name" PartnerClaimType="data.network.company_name" /> <OutputClaim ClaimTypeReferenceId="data.network.crawler_name" PartnerClaimType="data.network.crawler_name" /> <OutputClaim ClaimTypeReferenceId="data.network.is_corporate" PartnerClaimType="data.network.is_corporate" /> <OutputClaim ClaimTypeReferenceId="data.network.is_education" PartnerClaimType="data.network.is_education" /> <OutputClaim ClaimTypeReferenceId="data.network.is_hosting" PartnerClaimType="data.network.is_hosting" /> <OutputClaim ClaimTypeReferenceId="data.network.is_mobile" PartnerClaimType="data.network.is_mobile" /> <OutputClaim ClaimTypeReferenceId="data.network.is_proxy" PartnerClaimType="data.network.is_proxy" /> <OutputClaim ClaimTypeReferenceId="data.network.is_tor" PartnerClaimType="data.network.is_tor" /> <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_capable" PartnerClaimType="data.network.is_vpn_capable" /> <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_confirmed" PartnerClaimType="data.network.is_vpn_confirmed" /> <OutputClaim ClaimTypeReferenceId="data.network.is_vpn_suspect" PartnerClaimType="data.network.is_vpn_suspect" /> <OutputClaim ClaimTypeReferenceId="data.network.isp_name" PartnerClaimType="data.network.isp_name" /> <OutputClaim ClaimTypeReferenceId="data.network.vpn_name" PartnerClaimType="data.network.vpn_name" /> <OutputClaim ClaimTypeReferenceId="data.geo.city" PartnerClaimType="data.geo.city" /> <OutputClaim ClaimTypeReferenceId="data.geo.country" PartnerClaimType="data.geo.country" /> <OutputClaim ClaimTypeReferenceId="data.geo.lat" PartnerClaimType="data.geo.lat" /> <OutputClaim ClaimTypeReferenceId="data.geo.long" PartnerClaimType="data.geo.long" /> <OutputClaim ClaimTypeReferenceId="data.geo.state" PartnerClaimType="data.geo.state" /> <OutputClaim ClaimTypeReferenceId="data.device.ua_brand" PartnerClaimType="data.device.ua_brand" /> <OutputClaim ClaimTypeReferenceId="data.device.ua_browser" PartnerClaimType="data.device.ua_browser" /> <OutputClaim ClaimTypeReferenceId="data.device.ua_device_type" PartnerClaimType="data.device.ua_device_type" /> <OutputClaim ClaimTypeReferenceId="data.device.ua_name" PartnerClaimType="data.device.ua_name" /> <OutputClaim ClaimTypeReferenceId="data.device.ua_os" PartnerClaimType="data.device.ua_os" /> <OutputClaim ClaimTypeReferenceId="data.device.ua_type" PartnerClaimType="data.device.ua_type" /> <OutputClaim ClaimTypeReferenceId="data.device.ua_version" PartnerClaimType="data.device.ua_version" /> </OutputClaims> </TechnicalProfile> </TechnicalProfiles> </ClaimsProvider>
apikey
とsite
を、初回オンボード時に Deduce から提供された情報に置き換えます。
手順 7: ユーザー体験を追加する
この時点で、 Deduce RESTfull API は設定されていますが、サインアップページまたはサインイン ページではまだ使用できません。 独自のカスタム ユーザー体験がない場合は、既存のテンプレート ユーザー体験の複製を作成します。それ以外の場合は、次の手順に進みます。
スターター パックから
TrustFrameworkBase.xml
ファイルを開きます。を含む
Id=SignUpOrSignIn
要素の内容全体を検索してコピーします。TrustFrameworkExtensions.xml
を開き、UserJourneys 要素を見つけます。 要素が存在しない場合は、要素を追加します。UserJourneys 要素の子としてコピーした UserJourney 要素の内容全体を貼り付けます。
ユーザー体験の
Id
の名前を変更します。 たとえば、Id=CustomSignUpSignIn
のように指定します。
手順 8: ユーザー体験に Deduce API を追加する
これでユーザー体験が完了したので、Deduce を呼び出すオーケストレーション手順を追加します。
ユーザー体験に
Type=CombinedSignInAndSignUp
またはType=ClaimsProviderSelection
を含むオーケストレーション ステップ要素を見つけます。 通常は、オーケストレーションの最初の手順です。技術プロファイルを呼び出す新しいオーケストレーション ステップ
SelfAsserted-UserAgent
追加します。技術プロファイルを呼び出す新しいオーケストレーション ステップ
**deduce_insight_api**
追加します。UserJourney の次の例は、ローカル アカウント スターター パックに基づいています。
<UserJourneys> <UserJourney Id="CustomSignUpOrSignIn"> <OrchestrationSteps> <OrchestrationStep Order="1" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="Browser-UserAgent" TechnicalProfileReferenceId="SelfAsserted-UserAgent" /> </ClaimsExchanges> </OrchestrationStep> <OrchestrationStep Order="2" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin"> <ClaimsProviderSelections> <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" /> </ClaimsProviderSelections> <ClaimsExchanges> <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" /> </ClaimsExchanges> </OrchestrationStep> <OrchestrationStep Order="3" Type="ClaimsExchange"> <Preconditions> <Precondition Type="ClaimsExist" ExecuteActionsIf="true"> <Value>objectId</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="LocalAccountSignUpWithLogonEmail" /> </ClaimsExchanges> </OrchestrationStep> <!-- This step reads any user attributes that we may not have received when in the token. --> <OrchestrationStep Order="4" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" /> </ClaimsExchanges> </OrchestrationStep> <OrchestrationStep Order="5" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="DecideInsights" TechnicalProfileReferenceId="deduce_insight_api" /> </ClaimsExchanges> </OrchestrationStep> <OrchestrationStep Order="6" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" /> </OrchestrationSteps> <ClientDefinition ReferenceId="DefaultWeb" /> </UserJourney> </UserJourneys>
手順 9: 証明書利用者ポリシーを構成する
サービス利用者ポリシーは、Azure AD B2C が実行するユーザー ジャーニーを指定します。 SignUpOrSignIn_WithDeduce TechnicalProfile 要素の OutputClaims 要素を調整することで、アプリケーションに渡される要求を制御することもできます。 このサンプルでは、アプリケーションは中間層 API から情報を受け取ります。
<RelyingParty>
<DefaultUserJourney ReferenceId="CustomSignUpOrSignIn" />
<UserJourneyBehaviors>
<ScriptExecution>Allow</ScriptExecution>
</UserJourneyBehaviors>
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<OutputClaims>
<!-- <OutputClaim ClaimTypeReferenceId="user_agent" /> -->
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="email" />
<OutputClaim ClaimTypeReferenceId="correlationId" DefaultValue="{Context:CorrelationId}" />
<OutputClaim ClaimTypeReferenceId="data.sent_timestamp" PartnerClaimType="data.sent_timestamp" />
<OutputClaim ClaimTypeReferenceId="data.activity.ip.frequency" PartnerClaimType="data.activity.ip.frequency" />
<OutputClaim ClaimTypeReferenceId="data.activity.ip.lastseen" PartnerClaimType="data.activity.ip.lastseen" />
<OutputClaim ClaimTypeReferenceId="data.activity.ip.email_count" PartnerClaimType="data.activity.ip.email_count" />
<OutputClaim ClaimTypeReferenceId="data.activity.email.ip_count" PartnerClaimType="data.activity.email.ip_count" />
<OutputClaim ClaimTypeReferenceId="data.activity.email.lastseen" PartnerClaimType="data.activity.email.lastseen" />
<OutputClaim ClaimTypeReferenceId="data.activity.email.frequency" PartnerClaimType="data.activity.email.frequency" />
<OutputClaim ClaimTypeReferenceId="data.activity.emailip.frequency" PartnerClaimType="data.activity.emailip.frequency" />
<OutputClaim ClaimTypeReferenceId="data.activity.emailip.lastseen" PartnerClaimType="data.activity.emailip.lastseen" />
<OutputClaim ClaimTypeReferenceId="data.activity.emailip.match" PartnerClaimType="data.activity.emailip.match" />
<OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_email" PartnerClaimType="data.activity.emailip.rank_email" />
<OutputClaim ClaimTypeReferenceId="data.activity.emailip.rank_ip" PartnerClaimType="data.activity.emailip.rank_ip" />
<OutputClaim ClaimTypeReferenceId="data.signals.trust" PartnerClaimType="data.signals.trust" />
<OutputClaim ClaimTypeReferenceId="data.signals.info" PartnerClaimType="data.signals.info" />
<OutputClaim ClaimTypeReferenceId="data.signals.risk" PartnerClaimType="data.signals.risk" />
<OutputClaim ClaimTypeReferenceId="data.network.company_name" PartnerClaimType="data.network.company_name" />
<OutputClaim ClaimTypeReferenceId="data.network.crawler_name" PartnerClaimType="data.network.crawler_name" />
<OutputClaim ClaimTypeReferenceId="data.network.is_corporate" PartnerClaimType="data.network.is_corporate" />
<OutputClaim ClaimTypeReferenceId="data.network.is_education" PartnerClaimType="data.network.is_education" />
<OutputClaim ClaimTypeReferenceId="data.network.is_hosting" PartnerClaimType="data.network.is_hosting" />
<OutputClaim ClaimTypeReferenceId="data.network.is_mobile" PartnerClaimType="data.network.is_mobile" />
<OutputClaim ClaimTypeReferenceId="data.network.is_proxy" PartnerClaimType="data.network.is_proxy" />
<OutputClaim ClaimTypeReferenceId="data.network.is_tor" PartnerClaimType="data.network.is_tor" />
<OutputClaim ClaimTypeReferenceId="data.network.is_vpn_capable" PartnerClaimType="data.network.is_vpn_capable" />
<OutputClaim ClaimTypeReferenceId="data.network.is_vpn_confirmed" PartnerClaimType="data.network.is_vpn_confirmed" />
<OutputClaim ClaimTypeReferenceId="data.network.is_vpn_suspect" PartnerClaimType="data.network.is_vpn_suspect" />
<OutputClaim ClaimTypeReferenceId="data.network.isp_name" PartnerClaimType="data.network.isp_name" />
<OutputClaim ClaimTypeReferenceId="data.network.vpn_name" PartnerClaimType="data.network.vpn_name" />
<OutputClaim ClaimTypeReferenceId="data.geo.city" PartnerClaimType="data.geo.city" />
<OutputClaim ClaimTypeReferenceId="data.geo.country" PartnerClaimType="data.geo.country" />
<OutputClaim ClaimTypeReferenceId="data.geo.lat" PartnerClaimType="data.geo.lat" />
<OutputClaim ClaimTypeReferenceId="data.geo.long" PartnerClaimType="data.geo.long" />
<OutputClaim ClaimTypeReferenceId="data.geo.state" PartnerClaimType="data.geo.state" />
<OutputClaim ClaimTypeReferenceId="data.device.ua_brand" PartnerClaimType="data.device.ua_brand" />
<OutputClaim ClaimTypeReferenceId="data.device.ua_browser" PartnerClaimType="data.device.ua_browser" />
<OutputClaim ClaimTypeReferenceId="data.device.ua_device_type" PartnerClaimType="data.device.ua_device_type" />
<OutputClaim ClaimTypeReferenceId="data.device.ua_name" PartnerClaimType="data.device.ua_name" />
<OutputClaim ClaimTypeReferenceId="data.device.ua_os" PartnerClaimType="data.device.ua_os" />
<OutputClaim ClaimTypeReferenceId="data.device.ua_type" PartnerClaimType="data.device.ua_type" />
<OutputClaim ClaimTypeReferenceId="data.device.ua_version" PartnerClaimType="data.device.ua_version" />
<OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
手順 10: カスタム ポリシーをアップロードする
Azure portal にサインインします。
複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコンを選択し、[ディレクトリとサブスクリプション] メニューからお使いの Azure AD B2C テナントに切り替えます。
Azure portal で、Azure AD B2C を検索して選択します。
[ポリシー] で、[ Identity Experience Framework] を選択します。
[ カスタム ポリシーのアップロード] を選択し、変更した 2 つのポリシー ファイルを次の順序でアップロードします。拡張機能ポリシー (
TrustFrameworkBase.xml
など)、証明書利用者ポリシー (B2C_1A_signup
など)。
手順 11: カスタム ポリシーをテストする
関連パーティポリシー(例:
B2C_1A_signup
)を選択してください。[ アプリケーション] で、 以前に登録した Web アプリケーションを選択します。 応答 URL に
https://jwt.ms
が表示されます。[ 今すぐ実行 ] ボタンを選択します。
サインアップ ポリシーは、すぐに Deduce を呼び出す必要があります。 サインインが使用されている場合は、Deduce を選択して Deduce でサインインします。
サインイン プロセスが成功すると、ブラウザーは https://jwt.ms
にリダイレクトされ、Azure AD B2C によって返されるトークンの内容が表示されます。
次のステップ
詳細については、次の記事を参照してください。