設定具有 Deduce 的 Azure Active Directory B2C 來對抗身分識別詐騙,並建立受信任的用戶體驗
在此範例文章中,我們會提供如何整合 Azure Active Directory B2C(Azure AD B2C) 驗證與推斷的指引。 推算專注於停止帳戶接管和註冊欺詐,這是互聯網上增長最快的欺詐。 推斷身分識別網路是由超過 150,000 個網站和應用程式組成的聯盟所提供,這些網站和應用程式每天共用登入、註冊和簽出次數超過 14 億次。
產生的身分識別情報會在成為財務問題和公司責任之前停止攻擊。 它會使用歷史行為分析作為信任的預測工具,讓組織可以為最佳客戶提供無摩擦的用戶體驗。 完整的風險和信任訊號範圍可通知 Azure AD B2C 實例的每個驗證決策。 透過這項整合,組織可以在註冊或登入程式期間擴充其 Azure AD B2C 功能,以從 Deduce Insights API 取得使用者的其他見解。 推斷 API 所擷取的一些屬性包括:
- 電子郵件
- IP 位址
- User agent
必要條件
若要開始使用,您需要:
Azure 訂用帳戶。 如果您沒有帳戶,請取得 免費帳戶。
請連絡 Deduce 以設定測試或生產環境。
能夠使用 Azure AD B2C 自定義原則。 如果您無法,請完成開始使用 Azure AD B2C 中的自定義原則中的步驟,以瞭解如何使用自定義原則。
案例描述
整合包含下列元件:
- Azure AD B2C – 負責驗證使用者認證的授權伺服器,也稱為識別提供者。
- 推斷 – Deduce 服務會接受使用者所提供的輸入,並提供使用者身分識別的數位活動見解。
- 自定義 rest API – 此 API 會實作 Azure AD B2C 與 Deduce Insights API 之間的整合。
下列架構圖顯示實作:
步驟 | 描述 |
---|---|
1. | 用戶開啟 Azure AD B2C 的登入頁面,然後輸入其使用者名稱來登入或註冊。 |
2. | Azure AD B2C 會呼叫仲介層 API,並傳遞用戶屬性。 |
3. | 仲介層 API 會收集用戶屬性,並將其轉換成 Deduce API 可取用的格式,然後將它傳送至 Deduce。 |
4. | 推斷會取用資訊,並加以處理,以根據風險分析來驗證用戶識別。 然後,它會將結果傳回至仲介層 API。 |
5. | 仲介層 API 會處理資訊,並以正確的 JSON 格式將風險、信任和資訊訊號傳回給 Azure AD B2C。 |
6. | Azure AD B2C 會從仲介層 API 接收資訊。 如果顯示失敗回應,則會向用戶顯示錯誤訊息。 如果顯示成功回應,則會驗證使用者並寫入目錄。 |
使用推斷上線
若要建立 Deduce 帳戶,請連絡 Deduce 支援。 建立帳戶之後,您會收到 網站標識符,以及 API 組態所需的 API 金鑰 。
下列各節說明整合程式。
步驟 1:設定 Azure AD B2C 原則
請遵循取得入門套件中的指示,瞭解如何設定您的 Azure AD B2C 租使用者和設定原則。 此範例文章是以本機帳戶入門套件為基礎。
步驟 2:自定義 Azure AD B2C 使用者介面
若要從用戶端收集user_agent,請使用任意標識符建立您自己的 **ContentDefinition**
標識碼,以包含相關的 JavaScript。 判斷使用者瀏覽器的user_agent字串,並將其儲存為 Azure AD B2C 中的宣告。
在本機下載 api.selfasserted、 selfAsserted.cshtml。
編輯 selfAsserted.cshtml,以在關閉
</head>
之前包含下列 JavaScript,定義其他 Style 元素以隱藏 panel-default。<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
取代為您的 Azure AD B2C 租使用者名稱, 例如fabrikam
。 輸入租用戶名稱時,請使用所有小寫字母。針對 [允許的方法],選取
GET
和PUT
。選取 [儲存]。
步驟 4:設定內容定義
若要自定義使用者介面,您可以在元素中 ContentDefinition
指定具有自定義 HTML 內容的 URL。 在自我判斷技術配置檔或協調流程步驟中,您會指向該 ContentDefinition 識別符。
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 取代為指向步驟 1 中所建立檔案的 selfAsserted.cshtml
URL。
步驟 5:新增推斷其他 ClaimType
ClaimsSchema 元素會定義可當作原則一部分進行參考的宣告類型。 Deduce 支援並新增其他宣告。
開啟
TrustFrameworksExtension.xml
在元素中
**BuildingBlocks**
,可以新增 Deduce 支援的其他身分識別宣告。<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 服務,並在輸出宣告集合中接收數據。 如需詳細資訊,請參閱 在 Azure AD B2C 自定義原則中整合 REST API 宣告交換
您可以將 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>
在初始上線時,將 和 site
取代apikey
為 Deduce 所提供的資訊。
步驟 7:新增使用者旅程圖
此時, 已設定 Deduce RESTfull API ,但尚未在任何註冊或登入頁面中提供。 如果您沒有自己的自定義使用者旅程圖,請建立現有範本使用者旅程圖的重複項目,否則請繼續進行下一個步驟。
TrustFrameworkBase.xml
從入門套件開啟檔案。尋找並複製包含
Id=SignUpOrSignIn
之 UserJourneys 元素的整個內容。開啟 並
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 入口網站。
如果您有多個租使用者的存取權,請選取頂端功能表中的 [設定] 圖示,從 [目錄 + 訂用帳戶] 功能表切換至您的 Azure AD B2C 租使用者。
在 Azure 入口網站 中,搜尋並選取 [Azure AD B2C]。
在 [原則] 底下,選取 [ 身分識別體驗架構]。
選取 [ 上傳自定義原則],然後上傳您變更的兩個原則檔案,順序如下:擴充原則,例如
TrustFrameworkBase.xml
,然後是信賴憑證者原則,例如B2C_1A_signup
。
步驟 11:測試您的自定義原則
選取您的信賴憑證者原則,例如
B2C_1A_signup
。針對 [ 應用程式],選取您 先前註冊的 Web 應用程式。 回覆 URL 應該會顯示
https://jwt.ms
。選取 [ 立即 執行] 按鈕。
註冊原則應立即叫用 Deduce。 如果使用登入,請選取 [Deduce] 以使用 Deduce 登入。
如果登入程式成功,您的瀏覽器會重新導向至 https://jwt.ms
,以顯示 Azure AD B2C 所傳回令牌的內容。
下一步
如需詳細資訊,請檢閱下列文章: