Condividi tramite


Configurare un flusso di iscrizione e accesso per un account locale usando criteri personalizzati di Azure Active Directory B2C

Nell'articolo Creare e leggere un account utente usando i criteri personalizzati di Azure Active Directory B2C, un utente crea un nuovo account utente ma non lo accede.

Questo articolo descrive come scrivere criteri personalizzati di Azure Active Directory B2C (Azure AD B2C) che consentono a un utente di creare un account locale di Azure AD B2C o di accedervi. Un account locale fa riferimento a un account creato nel tenant di Azure AD B2C quando un utente accede all'applicazione.

Panoramica

Azure AD B2C usa openID Connessione protocollo di autenticazione per verificare le credenziali utente. In Azure AD B2C si inviano le credenziali utente insieme ad altre informazioni a un endpoint sicuro, che determina quindi se le credenziali sono valide o meno. In breve, quando si usa l'implementazione di Azure AD B2C di OpenID Connessione, è possibile esternalizzare l'iscrizione, l'accesso e altre esperienze di gestione delle identità nelle applicazioni Web a Microsoft Entra ID.

I criteri personalizzati di Azure AD B2C forniscono un profilo tecnico OpenID Connessione, che viene usato per effettuare una chiamata a un endpoint Microsoft sicuro. Altre informazioni su OpenID Connessione profilo tecnico.

Prerequisiti

Nota

Questo articolo fa parte della serie di procedure Creare ed eseguire criteri personalizzati in Azure Active Directory B2C. È consigliabile iniziare questa serie dal primo articolo.

Passaggio 1: Configurare openID Connessione profilo tecnico

Per configurare un profilo tecnico openID Connessione, è necessario eseguire tre passaggi:

  • Dichiarare più attestazioni.
  • Registrare le app nel portale di Azure.
  • Configurare infine OpenID Connessione Profilo tecnico

Passaggio 1.1 - Dichiarare altre attestazioni

ContosoCustomPolicy.XML Nel file individuare la sezione ClaimsSchema e quindi aggiungere altre attestazioni usando il codice seguente:

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

Passaggio 1.2 - Registrare le applicazioni del framework dell'esperienza di gestione delle identità

Azure AD B2C richiede di registrare due applicazioni usate per iscriversi e accedere agli utenti con account locali: IdentityExperienceFramework, un'API Web e ProxyIdentityExperienceFramework, un'app nativa con autorizzazione delegata all'app IdentityExperienceFramework.

Se non è già stato fatto, registrare le applicazioni seguenti. Per automatizzare la procedura dettagliata seguente, visitare l'app di installazione di IEF e seguire le istruzioni:

  1. Usare la procedura descritta in Registrare l'applicazione IdentityExperienceFramework per registrare l'applicazione Identity Experience Framework. Copiare l'ID applicazione (client), appID, per la registrazione dell'applicazione Identity Experience Framework da usare nel passaggio successivo.

  2. Usare la procedura descritta in Registrare l'applicazione ProxyIdentityExperienceFramework per registrare l'applicazione Proxy Identity Experience Framework. Copiare l'ID applicazione (client), proxyAppID, per la registrazione dell'applicazione Proxy Identity Experience Framework da usare nel passaggio successivo.

Passaggio 1.3 : Configurare il profilo tecnico di OpenID Connessione

ContosoCustomPolicy.XML Nel file individuare la sezione ClaimsProviders e quindi aggiungere un elemento Provider di attestazioni che contiene openID Connessione profilo tecnico usando il codice seguente:

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

Sostituire entrambe le istanze di:

  • appID con ID applicazione (client) dell'applicazione Identity Experience Framework copiata nel passaggio 1.2.

  • proxyAppID con ID applicazione (client) dell'applicazione Proxy Identity Experience Framework copiata nel passaggio 1.2.

Passaggio 2: Configurare l'interfaccia utente di accesso

Quando i criteri vengono eseguiti, l'utente deve visualizzare un'interfaccia utente che consente loro di accedere. L'interfaccia utente ha anche un'opzione per iscriversi se non ha già un account. A tale scopo, è necessario eseguire due passaggi:

  • Configurare un profilo tecnico autocertificato, che visualizza il modulo di accesso all'utente.
  • Configurare la definizione del contenuto per l'interfaccia utente di accesso.

Passaggio 2.1 - Configurare un profilo tecnico dell'interfaccia utente di accesso

ContosoCustomPolicy.XML Nel file individuare il SignInUser profilo tecnico e aggiungere un profilo tecnico SelfAsserted dopo di esso usando il codice seguente:

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

È stato aggiunto un profilo tecnico SelfAsserted, UserSignInCollector, che visualizza il modulo di accesso all'utente. Il profilo tecnico è stato configurato per raccogliere l'indirizzo di posta elettronica dell'utente come nome di accesso, come indicato nei setting.operatingMode metadati. Il modulo di accesso include un collegamento di iscrizione che consente all'utente di accedere a un modulo di iscrizione, come indicato dai SignUpTarget metadati. Si vedrà come configurare SignUpWithLogonEmailExchangeClaimsExchange nei passaggi di orchestrazione.

È stato anche aggiunto signInUser OpenID Connessione profilo tecnico come ValidationTechnicalProfile. Il profilo tecnico SignInUser viene quindi eseguito quando l'utente seleziona il pulsante Accedi (vedere lo screenshot nel passaggio 5).

Nel passaggio successivo (passaggio 2.2) viene configurata una definizione di contenuto che verrà usata in questo profilo tecnico SelfAsserted.

Passaggio 2.2: Configurare la definizione del contenuto dell'interfaccia di accesso

ContosoCustomPolicy.XML Nel file individuare la sezione ContentDefinitions e quindi accedere a Definizione contenuto usando il codice seguente:

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

È stata configurata una definizione di contenuto per il profilo tecnico autocertificato, SignupOrSigninContentDefinition. È possibile specificarlo nel profilo tecnico usando l'elemento di metadati o specificarlo quando si fa riferimento al profilo tecnico nei passaggi di orchestrazione. In precedenza si è appreso come specificare una definizione di contenuto direttamente nel profilo tecnico autocertitivo, quindi in questo articolo si apprenderà come specificarlo quando si fa riferimento al profilo tecnico nei passaggi di orchestrazione, passaggio 3.

Passaggio 3- Aggiornare i passaggi di orchestrazione del percorso utente

ContosoCustomPolicy.XML Nel file individuare il percorso utente HelloWorldJourney e sostituire tutta la raccolta di passaggi di orchestrazione con il codice seguente:

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

Nei passaggi di orchestrazione da due a cinque sono stati usati precondizioni per determinare se deve essere eseguito il passaggio di orchestrazione. È necessario determinare se l'utente accede o esegue l'iscrizione.

Quando vengono eseguiti i criteri personalizzati:

  • Passaggio di orchestrazione 1 : visualizza la pagina di accesso, in modo che l'utente possa accedere o selezionare il collegamento Iscriviti ora . Si noti che si specifica la definizione di contenuto usata dal profilo tecnico autocertificato UserSignInCollector per visualizzare il modulo di accesso.

  • Passaggio 2 dell'orchestrazione: questo passaggio viene eseguito se l'utente si iscrive (objectId non esiste), quindi viene visualizzato il modulo di selezione del tipo di account richiamando il profilo tecnico autocertifatto AccountTypeInputCollector .

  • Passaggio di orchestrazione 3 : questo passaggio viene eseguito se l'utente effettua l'iscrizione (objectId non esiste) e che un utente non seleziona una società accountType. È quindi necessario chiedere all'utente di immettere un oggetto accessCode richiamando il profilo tecnico autocertifatto AccessCodeInputCollector .

  • Passaggio 4 dell'orchestrazione: questo passaggio viene eseguito se l'utente si iscrive (objectId non esiste), quindi viene visualizzato il modulo di iscrizione richiamando il profilo tecnico autocertifatto UserInformationCollector .

  • Passaggio 5 dell'orchestrazione: questo passaggio legge le informazioni sull'account da Microsoft Entra ID (viene richiamato AAD-UserRead il profilo tecnico microsoft Entra ID), quindi viene eseguito se un utente esegue l'iscrizione o l'accesso.

  • Passaggio di orchestrazione 6 : questo passaggio richiama il profilo tecnico UserInputMessageClaimGenerator per assemblare il messaggio di saluto dell'utente.

  • Passaggio 7 dell'orchestrazione: infine, il passaggio 8 assembla e restituisce il token JWT alla fine dell'esecuzione del criterio.

Passaggio 4 - Caricare i criteri

Seguire la procedura descritta in Caricare un file di criteri personalizzato per caricare il file dei criteri. Se si carica un file con lo stesso nome di quello già presente nel portale, assicurarsi di selezionare Sovrascrivi il criterio personalizzato, se già esistente.

Passaggio 5 - Testare i criteri

Seguire la procedura descritta in Testare i criteri personalizzati per testare i criteri personalizzati. Una volta eseguiti i criteri, verrà visualizzata un'interfaccia simile alla schermata seguente:

screenshot of sign-up or sign-in interface.

È possibile accedere immettendo l'indirizzo di posta elettronica e la password di un account esistente. Se non si ha già un account, è necessario selezionare il collegamento Iscriviti ora per creare un nuovo account utente.

Passaggi successivi