分享方式:


使用 Azure Active Directory B2C 自訂原則設定本機帳戶的註冊和登入流程

使用 Azure Active Directory B2C 自訂原則 建立和讀取使用者帳戶一文中,使用者會建立新的使用者帳戶,但不會登入。

在本文中,您將瞭解如何撰寫 Azure Active Directory B2C (Azure AD B2C) 自訂原則,讓使用者建立 Azure AD B2C 本機帳戶或登入其中一個帳戶。 本機帳戶是指當使用者註冊應用程式時,會在 Azure AD B2C 租使用者中建立的帳戶。

概觀

Azure AD B2C 使用 OpenID 連線驗證通訊協定來驗證使用者認證。 在 Azure AD B2C 中,您會將使用者認證與其他資訊一起傳送至安全端點,然後判斷認證是否有效。 簡言之,當您使用 Azure AD B2C 的 OpenID 連線實作時,您可以將 Web 應用程式中的註冊、登入和其他身分識別管理體驗外包給 Microsoft Entra ID。

Azure AD B2C 自訂原則提供 OpenID 連線技術設定檔,讓您用來呼叫安全的 Microsoft 端點。 深入瞭解 OpenID 連線技術設定檔

必要條件

注意

本文是 Azure Active Directory B2C 操作指南系列 中建立和執行您自己的自訂原則的一部分 。 建議您從第一篇文章開始此系列。

步驟 1 - 設定 OpenID 連線技術設定檔

若要設定 OpenID 連線技術設定檔,您需要執行三個步驟:

  • 宣告更多宣告。
  • 在您的Azure 入口網站註冊應用程式。
  • 最後,設定 OpenID 連線 Technical Profile 本身

步驟 1.1 - 宣告更多宣告

在 檔案中 ContosoCustomPolicy.XML ,找出 ClaimsSchema 區段,然後使用下列程式碼新增更多宣告:

    <!--<ClaimsSchema>-->
        ...
        <ClaimType Id="grant_type">
            <DisplayName>grant_type</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="scope">
            <DisplayName>scope</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="nca">
            <DisplayName>nca</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="client_id">
            <DisplayName>client_id</DisplayName>
            <DataType>string</DataType>
            <AdminHelpText>Special parameter passed to EvoSTS.</AdminHelpText>
            <UserHelpText>Special parameter passed to EvoSTS.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="resource_id">
            <DisplayName>resource_id</DisplayName>
            <DataType>string</DataType>
            <AdminHelpText>Special parameter passed to EvoSTS.</AdminHelpText>
            <UserHelpText>Special parameter passed to EvoSTS.</UserHelpText>
        </ClaimType>
    <!--</ClaimsSchema>-->

步驟 1.2 - 註冊身分識別體驗架構應用程式

Azure AD B2C 會要求您註冊兩個應用程式,以使用本機帳戶註冊和登入使用者:IdentityExperienceFramework、Web API 和 ProxyIdentityExperienceFramework,這是具有 IdentityExperienceFramework 應用程式委派許可權的原生應用程式。

如果您尚未這麼做,請註冊下列應用程式。 若要自動化下列逐步解說,請流覽 IEF 安裝程式應用程式 ,並遵循指示:

  1. 使用註冊 IdentityExperienceFramework 應用程式中 的步驟 來註冊 Identity Experience Framework 應用程式。 針對身分識別體驗架構應用程式註冊複製應用程式識別碼(用戶端)識別碼 以供下一個步驟使用。

  2. 使用註冊 ProxyIdentityExperienceFramework 應用程式 中的 步驟來註冊 Proxy Identity Experience Framework 應用程式。 複製應用程式 (用戶端) 識別碼 ProxyAppID ,以取得 Proxy 身分識別體驗架構應用程式註冊,以供下一個步驟使用。

步驟 1.3 - 設定 OpenID 連線技術設定檔

在檔案中 ContosoCustomPolicy.XML ,找出 ClaimsProviders 區段,然後使用下列程式碼新增保留 OpenID 連線 Technical Profile 的 Claims Provider 元素:

    <!--<ClaimsProviders>-->
        ...
        <ClaimsProvider>
            <DisplayName>OpenID Connect Technical Profiles</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="SignInUser">
                    <DisplayName>Sign in with Local Account</DisplayName>
                    <Protocol Name="OpenIdConnect" />
                    <Metadata>
                        <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">We didn't find this account</Item>
                        <Item Key="UserMessageIfInvalidPassword">Your password or username is incorrect</Item>
                        <Item Key="UserMessageIfOldPasswordUsed">You've used an old password.</Item>
                        <Item Key="ProviderName">https://sts.windows.net/</Item>
                        <Item Key="METADATA">https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration</Item>
                        <Item Key="authorization_endpoint">https://login.microsoftonline.com/{tenant}/oauth2/token</Item>
                        <Item Key="response_types">id_token</Item>
                        <Item Key="response_mode">query</Item>
                        <Item Key="scope">email openid</Item>
                        <!-- Policy Engine Clients -->
                        <Item Key="UsePolicyInRedirectUri">false</Item>
                        <Item Key="HttpBinding">POST</Item>
                        <Item Key="client_id">proxyAppID</Item>
                        <Item Key="IdTokenAudience">appID</Item>
                    </Metadata>
                    <InputClaims>
                        <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="username" Required="true" />
                        <InputClaim ClaimTypeReferenceId="password" PartnerClaimType="password" Required="true" />
                        <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="password" />
                        <InputClaim ClaimTypeReferenceId="scope" DefaultValue="openid" />
                        <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" />
                        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="proxyAppID" />
                        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="appID" />
                    </InputClaims>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid" />
                    </OutputClaims>
                </TechnicalProfile>
            </TechnicalProfiles>
        </ClaimsProvider>
    <!--</ClaimsProviders>-->

取代這兩個 實例:

  • appID ,其中包含 您在步驟 1.2 複製之 Identity Experience Framework 應用程式的應用程式(用戶端)識別碼

  • proxyAppID 您在步驟 1.2 複製之 Proxy 身分識別體驗架構應用程式的應用程式(用戶端)識別碼

步驟 2 - 設定登入使用者介面

當您的原則執行時,使用者必須看到允許使用者登入的使用者介面。 如果使用者還沒有帳戶,使用者介面也有註冊的選項。 若要這樣做,您必須執行兩個步驟:

  • 設定自我判斷技術設定檔,向使用者顯示登入表單。
  • 設定登入使用者介面的內容定義。

步驟 2.1 - 設定登入使用者介面技術設定檔

在 檔案中 ContosoCustomPolicy.XMLSignInUser ,找出技術設定檔,並使用下列程式碼在之後新增 SelfAsserted Technical Profile:

    <TechnicalProfile Id="UserSignInCollector">
        <DisplayName>Local Account Signin</DisplayName>
        <Protocol Name="Proprietary"
            Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
            <Item Key="setting.operatingMode">Email</Item>
            <Item Key="SignUpTarget">AccountTypeInputCollectorClaimsExchange</Item>
        </Metadata>
        <DisplayClaims>
            <DisplayClaim ClaimTypeReferenceId="email" Required="true" />
            <DisplayClaim ClaimTypeReferenceId="password" Required="true" />
        </DisplayClaims>
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" />
            <OutputClaim ClaimTypeReferenceId="password"  />
            <OutputClaim ClaimTypeReferenceId="objectId" />
        </OutputClaims>
        <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="SignInUser" />
        </ValidationTechnicalProfiles>
    </TechnicalProfile>

我們已新增 SelfAsserted Technical Profile UserSignInCollector ,以向使用者顯示登入表單。 我們已設定技術設定檔,以收集使用者的電子郵件地址作為其登入名稱,如中繼資料所示 setting.operatingMode 。 登入表單包含註冊連結,可讓使用者以中繼資料表示 SignUpTarget 的註冊表單。 您將瞭解如何在協調流程步驟中設定 SignUpWithLogonEmailExchange ClaimsExchange

此外,我們已將 SignInUser OpenID 連線 Technical Profile 新增 ValidationTechnicalProfile 。 因此,當使用者選取 [登入 ] 按鈕時, 就會執行 SignInUser 技術設定檔(請參閱步驟 5 中的 螢幕擷取畫面)。

在下一個步驟 ( 步驟 2.2 ) 中,我們會設定我們將在此 SelfAsserted 技術設定檔中使用的內容定義。

步驟 2.2 - 設定登入介面內容定義

在 檔案中,找出 ContentDefinitions 區段,然後使用下列程式碼登入 內容定義 ContosoCustomPolicy.XML

    <!--<ContentDefinitions>-->
        ...
            <ContentDefinition Id="SignupOrSigninContentDefinition">
                <LoadUri>~/tenant/templates/AzureBlue/unified.cshtml</LoadUri>
                <RecoveryUri>~/common/default_page_error.html</RecoveryUri>
                <DataUri>urn:com:microsoft:aad:b2c:elements:contract:unifiedssp:2.1.7</DataUri>
                <Metadata>
                    <Item Key="DisplayName">Signin and Signup</Item>
                </Metadata>
            </ContentDefinition>
    <!--</ContentDefinitions>-->

我們已為自我判斷技術設定檔 SignupOrSigninContentDefinition 設定內容定義。 我們可以使用中繼資料元素在技術設定檔中指定它,或在協調流程步驟中參考技術設定檔時指定它。 先前,我們已瞭解如何直接在自我判斷技術設定檔中指定內容定義,因此在本文中,我們將瞭解如何在協調流程步驟 步驟 的步驟中參考技術設定檔時指定它。

步驟 3 - 更新使用者旅程圖協調流程步驟

在 檔案中 ContosoCustomPolicy.XML ,找出 HelloWorldJourney 使用者旅程圖,並以下列程式碼取代其所有協調流程步驟集合:

    <!--<OrchestrationSteps>-->
        ...
        <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="SignupOrSigninContentDefinition">
            <ClaimsProviderSelections>
                <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" />
            </ClaimsProviderSelections>
            <ClaimsExchanges>
                <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="UserSignInCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="AccountTypeInputCollectorClaimsExchange" TechnicalProfileReferenceId="AccountTypeInputCollector"/>
            </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="3" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                  <Value>accountType</Value>
                  <Value>company</Value>
                  <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="GetAccessCodeClaimsExchange" TechnicalProfileReferenceId="AccessCodeInputCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>
        
        <OrchestrationStep Order="4" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="UserInformationCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>  
      
        <OrchestrationStep Order="5" Type="ClaimsExchange">
            <ClaimsExchanges>
            <ClaimsExchange Id="AADUserReaderExchange" TechnicalProfileReferenceId="AAD-UserRead"/>
            </ClaimsExchanges>
        </OrchestrationStep>                
        
        <OrchestrationStep Order="6" Type="ClaimsExchange">
            <ClaimsExchanges>
            <ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="UserInputMessageClaimGenerator"/>
            </ClaimsExchanges>          
        </OrchestrationStep>                
        
        <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    <!--</OrchestrationSteps>-->

在協調流程步驟 2 到 5 中,我們已使用前置條件來判斷協調流程步驟是否應該執行。 我們需要判斷使用者是否登入或註冊。

自訂原則執行時:

  • 協調流程步驟 1 - 顯示登入頁面,讓使用者可以登入或選取 [立即 註冊] 連結。 請注意,我們會指定 UserSignInCollector 自我判斷技術設定檔用來顯示登入表單的內容定義

  • 協調流程步驟 2 - 如果使用者註冊 ( objectId 不存在),則此步驟會執行,因此我們會叫 用 AccountTypeInputCollector 自我判斷技術設定檔來顯示帳戶類型選取表單。

  • 協調流程步驟 3 - 如果使用者註冊 ( objectId 不存在),且使用者未選取公司 accountType ,就會執行此步驟。 因此,我們必須藉由 叫用 AccessCodeInputCollector 自我判斷技術設定檔來要求使用者輸入 accessCode

  • 協調流程步驟 4 - 如果使用者註冊時執行此步驟(objectId 不存在),因此我們會叫 用 UserInformationCollector 自我判斷技術設定檔來顯示註冊表單。

  • 協調流程步驟 5 - 此步驟會從 Microsoft Entra ID 讀取帳戶資訊(我們叫 AAD-UserRead 用 Microsoft Entra ID 技術設定檔),因此它會執行使用者註冊或登入。

  • 協調流程步驟 6 - 此步驟會 叫用 UserInputMessageClaimGenerator 技術設定檔來組合使用者的問候訊息。

  • 協調流程步驟 7 - 最後,步驟 8 元件,並在原則執行結束時傳回 JWT 權杖。

步驟 4 - 上傳原則

請遵循上傳自訂原則檔案 中的 步驟來上傳您的原則檔案。 如果您要上傳與入口網站中已有相同名稱的檔案,請確定您已選取 [覆寫自訂原則] ,如果檔案已經存在

步驟 5 - 測試原則

請遵循測試自訂原則 中的步驟 來測試您的自訂原則。 原則執行之後,您會看到類似以下螢幕擷取畫面的介面:

screenshot of sign-up or sign-in interface.

您可以輸入 現有帳戶的電子郵件地址和 密碼 來登入。 如果您還沒有帳戶,您必須選取 [立即註冊 ] 連結以建立新的使用者帳戶。

下一步