Udostępnij za pośrednictwem


Konfigurowanie przepływu rejestracji i logowania dla konta lokalnego przy użyciu niestandardowych zasad usługi Azure Active Directory B2C

W artykule Tworzenie i odczytywanie konta użytkownika przy użyciu zasad niestandardowych usługi Azure Active Directory B2C użytkownik tworzy nowe konto użytkownika, ale nie loguje się do niego.

Z tego artykułu dowiesz się, jak napisać niestandardowe zasady usługi Azure Active Directory B2C (Azure AD B2C), które umożliwiają użytkownikowi utworzenie konta lokalnego usługi Azure AD B2C lub zalogowanie się do nich. Konto lokalne odwołuje się do konta utworzonego w dzierżawie usługi Azure AD B2C, gdy użytkownik zarejestruje się w aplikacji.

Omówienie

Usługa Azure AD B2C używa protokołu uwierzytelniania openID Połączenie do weryfikowania poświadczeń użytkownika. W usłudze Azure AD B2C poświadczenia użytkownika są wysyłane wraz z innymi informacjami do bezpiecznego punktu końcowego, który określa, czy poświadczenia są prawidłowe, czy nie. W skrócie, gdy używasz implementacji interfejsu OpenID usługi Azure AD B2C Połączenie, możesz zlecić rejestrację, logowanie i inne środowiska zarządzania tożsamościami w aplikacjach internetowych do identyfikatora Entra firmy Microsoft.

Niestandardowe zasady usługi Azure AD B2C udostępniają profil techniczny openID Połączenie, którego używasz do wywołania bezpiecznego punktu końcowego firmy Microsoft. Dowiedz się więcej o profilu technicznym openID Połączenie.

Wymagania wstępne

Uwaga

Ten artykuł jest częścią serii Instrukcje tworzenia i uruchamiania własnych zasad niestandardowych w usłudze Azure Active Directory B2C. Zalecamy rozpoczęcie tej serii od pierwszego artykułu.

Krok 1. Konfigurowanie profilu technicznego openID Połączenie

Aby skonfigurować profil techniczny openID Połączenie, należy wykonać trzy kroki:

  • Zadeklaruj więcej oświadczeń.
  • Rejestrowanie aplikacji w witrynie Azure Portal.
  • Na koniec skonfiguruj sam profil techniczny openID Połączenie

Krok 1.1 . Deklarowanie większej liczby oświadczeń

ContosoCustomPolicy.XML W pliku znajdź sekcję ClaimsSchema, a następnie dodaj więcej oświadczeń przy użyciu następującego kodu:

    <!--<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>-->

Krok 1.2. Rejestrowanie aplikacji platformy Identity Experience Framework

Usługa Azure AD B2C wymaga zarejestrowania dwóch aplikacji używanych do rejestrowania i logowania użytkowników przy użyciu kont lokalnych: IdentityExperienceFramework, internetowego interfejsu API i proxyIdentityExperienceFramework, aplikacji natywnej z delegowanymi uprawnieniami do aplikacji IdentityExperienceFramework.

Jeśli jeszcze tego nie zrobiono, zarejestruj następujące aplikacje. Aby zautomatyzować poniższy przewodnik, odwiedź aplikację konfiguracji IEF i postępuj zgodnie z instrukcjami:

  1. Wykonaj kroki opisane w temacie Rejestrowanie aplikacji IdentityExperienceFramework, aby zarejestrować aplikację Identity Experience Framework. Skopiuj identyfikator aplikacji (klienta), appID, aby uzyskać rejestrację aplikacji platformy Identity Experience Framework do użycia w następnym kroku.

  2. Wykonaj kroki opisane w temacie Rejestrowanie aplikacji ProxyIdentityExperienceFramework, aby zarejestrować aplikację Platformy obsługi tożsamości serwera proxy. Skopiuj identyfikator aplikacji (klienta), proxyAppID, dla rejestracji aplikacji Proxy Identity Experience Framework do użycia w następnym kroku.

Krok 1.3 — Konfigurowanie profilu technicznego openID Połączenie

ContosoCustomPolicy.XML W pliku znajdź sekcję ClaimsProviders, a następnie dodaj element Dostawcy oświadczeń, który zawiera identyfikator OpenID Połączenie profilu technicznego przy użyciu następującego kodu:

    <!--<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>-->

Zastąp oba wystąpienia:

  • appID z identyfikatorem aplikacji (klienta) aplikacji Identity Experience Framework skopiowanej w kroku 1.2.

  • proxyAppID z identyfikatorem aplikacji (klienta) aplikacji Proxy Identity Experience Framework skopiowanej w kroku 1.2.

Krok 2. Konfigurowanie interfejsu użytkownika logowania

Po uruchomieniu zasad użytkownik musi zobaczyć interfejs użytkownika, który pozwala im się zalogować. Interfejs użytkownika ma również możliwość zarejestrowania się, jeśli nie ma jeszcze konta. W tym celu należy wykonać dwa kroki:

  • Skonfiguruj własny profil techniczny, który wyświetla użytkownikowi formularz logowania.
  • Skonfiguruj definicję zawartości dla interfejsu użytkownika logowania.

Krok 2.1 . Konfigurowanie profilu technicznego interfejsu użytkownika logowania

ContosoCustomPolicy.XML W pliku znajdź SignInUser profil techniczny i dodaj po nim profil techniczny selfAsserted przy użyciu następującego kodu:

    <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>

Dodaliśmy profil techniczny SelfAsserted UserSignInCollector, który wyświetla formularz logowania do użytkownika. Skonfigurowaliśmy profil techniczny w celu zbierania adresu e-mail użytkownika jako nazwy logowania wskazanego setting.operatingMode w metadanych. Formularz logowania zawiera link do rejestracji, który prowadzi użytkownika do formularza rejestracji wskazanego SignUpTarget przez metadane. Zobaczysz, jak skonfigurowaliśmy element SignUpWithLogonEmailExchangeClaimsExchange w krokach aranżacji.

Dodaliśmy również identyfikator OpenID SignInUser Połączenie Profil techniczny jako ValidationTechnicalProfile. Dlatego profil techniczny SignInUser jest wykonywany, gdy użytkownik wybierze przycisk Zaloguj (zobacz zrzut ekranu w kroku 5).

W następnym kroku (krok 2.2) skonfigurujemy definicję zawartości, która będzie używana w tym profilu technicznym selfAsserted.

Krok 2.2. Konfigurowanie definicji zawartości interfejsu logowania

ContosoCustomPolicy.XML W pliku znajdź sekcję ContentDefinitions, a następnie zaloguj się przy użyciu następującego kodu:

    <!--<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>-->

Skonfigurowaliśmy definicję zawartości dla naszego własnego profilu technicznego, SignupOrSigninContentDefinition. Możemy określić go w profilu technicznym przy użyciu elementu metadanych lub określić go, gdy odwołujemy się do profilu technicznego w krokach aranżacji. Wcześniej dowiedzieliśmy się, jak określić definicję zawartości bezpośrednio w własnym profilu technicznym, więc w tym artykule dowiesz się, jak określić ją podczas odwołowania się do profilu technicznego w krokach aranżacji, krok 3.

Krok 3. Aktualizowanie kroków orkiestracji podróży użytkownika

ContosoCustomPolicy.XML W pliku znajdź podróż użytkownika HelloWorldJourney i zastąp całą kolekcję kroków aranżacji następującym kodem:

    <!--<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>-->

W krokach aranżacji od dwóch do pięciu użyliśmy warunków wstępnych, aby określić, czy należy uruchomić krok orkiestracji. Musimy określić, czy użytkownik loguje się lub rejestruje.

Po uruchomieniu zasad niestandardowych:

  • Orchestration Step 1 — wyświetla stronę logowania, aby użytkownik mógł się zalogować lub wybrać link Zarejestruj się teraz . Zwróć uwagę, że określamy definicję zawartości używaną przez użytkownika UserSignInCollector do wyświetlania formularza logowania.

  • Orkiestracja Krok 2 — ten krok jest uruchamiany, jeśli użytkownik się zarejestruje (objectId nie istnieje), dlatego wyświetlimy formularz wyboru typu konta, wywołując profil techniczny AccountTypeInputCollector .

  • Aranżacja Krok 3 — ten krok jest uruchamiany, jeśli użytkownik zarejestruje się (objectId nie istnieje) i że użytkownik nie wybierze firmy accountType. Dlatego musimy poprosić użytkownika o wprowadzenie przez accessCode wywołanie profilu technicznego AccessCodeInputCollector .

  • Orchestration Step 4 — ten krok jest uruchamiany, jeśli użytkownik zarejestruje się (objectId nie istnieje), dlatego wyświetlimy formularz rejestracji, wywołując profil techniczny UserInformationCollector .

  • Orchestration Step 5 — ten krok odczytuje informacje o koncie z identyfikatora Microsoft Entra ID (wywołujemy AAD-UserRead profil techniczny Microsoft Entra ID), aby był uruchamiany niezależnie od tego, czy użytkownik zarejestrował się, czy się zalogował.

  • Orchestration Step 6 — ten krok wywołuje profil techniczny UserInputMessageClaimGenerator , aby zebrać wiadomość powitalną użytkownika.

  • Orkiestracja Krok 7 — Na koniec krok 8 zestawów i zwraca token JWT na końcu wykonywania zasad.

Krok 4. Przekazywanie zasad

Wykonaj kroki opisane w temacie Przekazywanie pliku zasad niestandardowych, aby przekazać plik zasad. Jeśli przekazujesz plik o tej samej nazwie co plik już w portalu, upewnij się, że wybierzesz pozycję Zastąp zasady niestandardowe, jeśli już istnieje.

Krok 5. Testowanie zasad

Wykonaj kroki opisane w artykule Testowanie zasad niestandardowych, aby przetestować zasady niestandardowe. Po uruchomieniu zasad zobaczysz interfejs podobny do poniższego zrzutu ekranu:

screenshot of sign-up or sign-in interface.

Możesz się zalogować, wprowadzając adres e-mail i hasło istniejącego konta. Jeśli nie masz jeszcze konta, musisz wybrać link Zarejestruj się teraz , aby utworzyć nowe konto użytkownika.

Następne kroki