Partilhar via


Configurar um fluxo de inscrição e entrada com uma conta social usando a política personalizada do Azure Ative Directory B2C

No artigo Configurar um fluxo de inscrição e entrada usando a política personalizada do Azure Ative Directory B2C, configuramos o fluxo de entrada para uma conta local usando o Azure Ative Directory B2C (Azure AD B2C).

Neste artigo, adicionamos um fluxo de entrada para uma conta externa, como uma conta social como o Facebook. Nesse caso, o Azure AD B2C permite que um usuário entre em seu aplicativo com credenciais de um provedor de identidade social (IdP) externo.

Para contas locais, uma conta de usuário é identificada exclusivamente usando o objectIdatributo user. Para IdP externo, usamos alternativeSecurityId o atributo user, embora ainda exista um objectId .

Pré-requisitos

Nota

Este artigo faz parte da série de guias de instruções Criar e executar suas próprias políticas personalizadas no Azure Ative Directory B2C. Recomendamos que comece esta série desde o primeiro artigo.

Passo 1 - Criar aplicação Facebook

Use as etapas descritas em Criar um aplicativo do Facebook para obter o ID do aplicativo do Facebook e o Segredo do aplicativo. Ignore os pré-requisitos e o resto dos passos no artigo Configurar inscrição e iniciar sessão com uma conta do Facebook.

Etapa 2 - Criar chave de política do Facebook

Use as etapas descritas em Criar o armazenamento de chaves do Facebook uma chave de política em seu locatário do Azure AD B2C. Ignore os pré-requisitos e o resto dos passos no artigo Configurar inscrição e iniciar sessão com uma conta do Facebook.

Passo 3 - Configurar o início de sessão com o Facebook

Para configurar o início de sessão com o Facebook, tem de executar os seguintes passos:

  • Declarar mais reclamações
  • Defina mais transformações de declarações para ajudar com manipulações de declarações, como a criação de AlternativeSecurityId.
  • Configurar o provedor de declarações do Facebook
  • Configure os perfis técnicos do Microsoft Entra para ler e gravar a conta social de e para o banco de dados do Microsoft Entra.
  • Configure um perfil técnico autodeclarado (para aceitar entradas adicionais do usuário ou atualizar detalhes do usuário) e sua definição de conteúdo.

Etapa 3.1 - Declarar mais reclamações

ContosoCustomPolicy.XML No arquivo, localize a ClaimsSchema seção e, em seguida, declare mais declarações usando o seguinte código:

    <!--<ClaimsSchema>-->
        ...
        <ClaimType Id="issuerUserId">
            <DisplayName>Username</DisplayName>
            <DataType>string</DataType>
            <UserHelpText/>
            <UserInputType>TextBox</UserInputType>
            <Restriction>
                <Pattern RegularExpression="^[a-zA-Z0-9]+[a-zA-Z0-9_-]*$" HelpText="The username you provided is not valid. It must begin with an alphabet or number and can contain alphabets, numbers and the following symbols: _ -" />
            </Restriction>
        </ClaimType>
        
        <ClaimType Id="identityProvider">
            <DisplayName>Identity Provider</DisplayName>
            <DataType>string</DataType>
            <UserHelpText/>
        </ClaimType>
        
        <ClaimType Id="authenticationSource">
            <DisplayName>AuthenticationSource</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Specifies whether the user was authenticated at Social IDP or local account.</UserHelpText>
        </ClaimType>  
        
        <ClaimType Id="upnUserName">
            <DisplayName>UPN User Name</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>The user name for creating user principal name.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="alternativeSecurityId">
            <DisplayName>AlternativeSecurityId</DisplayName>
            <DataType>string</DataType>
            <UserHelpText/>
        </ClaimType>
        
        <ClaimType Id="mailNickName">
            <DisplayName>MailNickName</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Your mail nick name as stored in the Azure Active Directory.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="newUser">
            <DisplayName>User is new or not</DisplayName>
            <DataType>boolean</DataType>
            <UserHelpText/>
        </ClaimType>
    <!--</ClaimsSchema>-->

Etapa 3.2 - Definir transformações de declarações

No arquivo, localize o ContosoCustomPolicy.XML ClaimsTransformations elemento e adicione transformações de declarações usando o seguinte código:

   <!--<ClaimsTransformations>-->
       ...
       <ClaimsTransformation Id="CreateRandomUPNUserName" TransformationMethod="CreateRandomString">
           <InputParameters>
               <InputParameter Id="randomGeneratorType" DataType="string" Value="GUID" />
           </InputParameters>
           <OutputClaims>
               <OutputClaim ClaimTypeReferenceId="upnUserName" TransformationClaimType="outputClaim" />
           </OutputClaims>
       </ClaimsTransformation>
   
       <ClaimsTransformation Id="CreateAlternativeSecurityId" TransformationMethod="CreateAlternativeSecurityId">
           <InputClaims>
               <InputClaim ClaimTypeReferenceId="issuerUserId" TransformationClaimType="key" />
               <InputClaim ClaimTypeReferenceId="identityProvider" TransformationClaimType="identityProvider" />
           </InputClaims>
           <OutputClaims>
               <OutputClaim ClaimTypeReferenceId="alternativeSecurityId" TransformationClaimType="alternativeSecurityId" />
           </OutputClaims>
       </ClaimsTransformation>
       
       <ClaimsTransformation Id="CreateUserPrincipalName" TransformationMethod="FormatStringClaim">
           <InputClaims>
               <InputClaim ClaimTypeReferenceId="upnUserName" TransformationClaimType="inputClaim" />
           </InputClaims>
           <InputParameters>
               <InputParameter Id="stringFormat" DataType="string" Value="cpim_{0}@{RelyingPartyTenantId}" />
           </InputParameters>
           <OutputClaims>
               <OutputClaim ClaimTypeReferenceId="userPrincipalName" TransformationClaimType="outputClaim" />
           </OutputClaims>
       </ClaimsTransformation>
   <!--</ClaimsTransformations>-->

Definimos três Transformações de Declarações, que usamos para gerar valores e alternativeSecurityId userPrincipalName declarações. Essas ClaimsTransformations são invocadas no perfil técnico OAuth2 na etapa 3.3.

Etapa 3.3 - Configurar o provedor de declarações do Facebook

Para permitir que os usuários entrem usando uma conta do Facebook, você precisa definir a conta como um provedor de declarações com o qual o Azure AD B2C pode se comunicar por meio de um ponto de extremidade. Você pode definir uma conta do Facebook como um provedor de declarações.

ContosoCustomPolicy.XML No arquivo, localize ClaimsProviders o elemento , adicione um novo provedor de declarações usando o seguinte código:

    <!--<ClaimsProviders>-->
        ...
        <ClaimsProvider>
            <!-- The following Domain element allows this profile to be used if the request comes with domain_hint 
                    query string parameter, e.g. domain_hint=facebook.com  -->
            <Domain>facebook.com</Domain>
            <DisplayName>Facebook</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="Facebook-OAUTH">
                <!-- The text in the following DisplayName element is shown to the user on the claims provider 
                        selection screen. -->
                <DisplayName>Facebook</DisplayName>
                <Protocol Name="OAuth2" />
                <Metadata>
                    <Item Key="ProviderName">facebook</Item>
                    <Item Key="authorization_endpoint">https://www.facebook.com/dialog/oauth</Item>
                    <Item Key="AccessTokenEndpoint">https://graph.facebook.com/oauth/access_token</Item>
                    <Item Key="HttpBinding">GET</Item>
                    <Item Key="UsePolicyInRedirectUri">0</Item>                
                    <Item Key="client_id">facebook-app-id</Item>
                    <Item Key="scope">email public_profile</Item>
                    <Item Key="ClaimsEndpoint">https://graph.facebook.com/me?fields=id,first_name,last_name,name,email</Item>
                    <Item Key="AccessTokenResponseFormat">json</Item>
                </Metadata>
                <CryptographicKeys>
                    <Key Id="client_secret" StorageReferenceId="facebook-policy-key" />
                </CryptographicKeys>
                <InputClaims />
                <OutputClaims>
                    <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="id" />
                    <OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="first_name" />
                    <OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="last_name" />
                    <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
                    <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
                    <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="facebook.com" AlwaysUseDefaultValue="true" />
                    <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
                </OutputClaims>
                <OutputClaimsTransformations>
                    <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
                    <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
                    <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
                </OutputClaimsTransformations>
                </TechnicalProfile>
            </TechnicalProfiles>
        </ClaimsProvider>
    <!--</ClaimsProviders>-->

Substituir:

  • facebook-app-id com o valor do Facebook appID que obteve no passo 1.
  • facebook-policy-key com o nome da chave de política do Facebook que obteve no passo 2.

Observe as transformações de declarações que definimos na etapa 3.2 da OutputClaimsTransformations coleção.

Etapa 3.4 - Criar perfis técnicos do Microsoft Entra

Assim como no login com uma conta local, você precisa configurar os Perfis Técnicos do Microsoft Entra, que você usa para se conectar ao armazenamento de ID do Microsoft Entra, para armazenar ou ler uma conta social do usuário.

  1. No arquivo, localize o ContosoCustomPolicy.XML AAD-UserUpdate perfil técnico e, em seguida, adicione um novo perfil técnico usando o seguinte código:

        <TechnicalProfile Id="AAD-UserWriteUsingAlternativeSecurityId">
            <DisplayName>Azure Active Directory technical profile for handling social accounts</DisplayName>
            <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.AzureActiveDirectoryProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    
            <Metadata>
                <Item Key="Operation">Write</Item>
                <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item>
            </Metadata>        
    
            <CryptographicKeys>
                <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
            </CryptographicKeys>
            <InputClaims>
                <InputClaim ClaimTypeReferenceId="alternativeSecurityId" PartnerClaimType="alternativeSecurityId" Required="true" />
            </InputClaims>
            <PersistedClaims>
                <!-- Required claims -->
                <PersistedClaim ClaimTypeReferenceId="alternativeSecurityId" />
                <PersistedClaim ClaimTypeReferenceId="userPrincipalName" />
                <PersistedClaim ClaimTypeReferenceId="mailNickName" DefaultValue="unknown" />
                <PersistedClaim ClaimTypeReferenceId="displayName" DefaultValue="unknown" />
    
                <!-- Optional claims -->
                <PersistedClaim ClaimTypeReferenceId="givenName" />
                <PersistedClaim ClaimTypeReferenceId="surname" />
            </PersistedClaims>
            <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="objectId" />
                <OutputClaim ClaimTypeReferenceId="newUser" PartnerClaimType="newClaimsPrincipalCreated" />
            </OutputClaims>
    
        </TechnicalProfile>
    

    Adicionámos um novo Perfil AAD-UserWriteUsingAlternativeSecurityId Técnico do Microsoft Entra que escreve uma nova conta social no Microsoft Entra ID.

  2. Substitua B2C_1A_TokenSigningKeyContainer pela chave de assinatura de token criada em Configurar a assinatura.

  3. ContosoCustomPolicy.XML No arquivo, adicione outro perfil técnico do Microsoft Entra após o perfil técnico usando o AAD-UserWriteUsingAlternativeSecurityId seguinte código:

       <TechnicalProfile Id="AAD-UserReadUsingAlternativeSecurityId">
           <DisplayName>Azure Active Directory</DisplayName>
           <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.AzureActiveDirectoryProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
           <Metadata>
               <Item Key="Operation">Read</Item>
               <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">false</Item>
           </Metadata>
           <CryptographicKeys>
               <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
               </CryptographicKeys>
           <InputClaims>
               <InputClaim ClaimTypeReferenceId="alternativeSecurityId" PartnerClaimType="alternativeSecurityId" Required="true" />
           </InputClaims>
           <OutputClaims>
               <!-- Required claims -->
               <OutputClaim ClaimTypeReferenceId="objectId" />
    
               <!-- Optional claims -->
               <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
               <OutputClaim ClaimTypeReferenceId="displayName" />
               <OutputClaim ClaimTypeReferenceId="givenName" />
               <OutputClaim ClaimTypeReferenceId="surname" />
           </OutputClaims>
       </TechnicalProfile>
    

    Adicionamos um novo Perfil AAD-UserReadUsingAlternativeSecurityId Técnico do Microsoft Entra que lê uma nova conta social do Microsoft Entra ID. Ele usa alternativeSecurityId como um identificador exclusivo para a conta social.

  4. Substitua B2C_1A_TokenSigningKeyContainer pela chave de assinatura de token criada em Configurar a assinatura.

Etapa 3.5 - Configurar a definição de conteúdo

Depois que um usuário faz login, você pode coletar algumas informações dele usando um perfil técnico autodeclarado. Portanto, você precisa configurar a definição de conteúdo para o perfil técnico autoafirmado.

ContosoCustomPolicy.XML No arquivo, localize o elemento e, em seguida, adicione uma nova definição de conteúdo na ContentDefinitions coleção usando o ContentDefinitions seguinte código:

    <ContentDefinition Id="socialAccountsignupContentDefinition">
        <LoadUri>~/tenant/templates/AzureBlue/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">Collect information from user page alongside those from social Idp.</Item>
        </Metadata>
    </ContentDefinition>

Usamos essa definição de conteúdo como metadados em um perfil técnico autoafirmado na próxima etapa (etapa 3.6).

Etapa 3.6 - Configurar um perfil técnico autodeclarado

O perfil técnico autodeclarado que você configura nesta etapa é usado para coletar mais informações do usuário ou atualizar informações semelhantes obtidas da conta social.

ContosoCustomPolicy.XML No arquivo, localize a ClaimsProviders seção e, em seguida, adicione um novo provedor de declarações usando o seguinte código:

    <!--<ClaimsProviders>-->
        ...
        <ClaimsProvider>
            <DisplayName>Self Asserted for social sign in</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="SelfAsserted-Social">
                    <DisplayName>Collect more info during social signup</DisplayName>
                    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
                    <Metadata>
                      <Item Key="ContentDefinitionReferenceId">socialAccountsignupContentDefinition</Item>
                    </Metadata>
                    <CryptographicKeys>
                      <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
                    </CryptographicKeys>
                    <InputClaims>
                      <!-- These claims ensure that any values retrieved in the previous steps (e.g. from an external IDP) are prefilled. 
                           Note that some of these claims may not have any value, for example, if the external IDP did not provide any of
                           these values, or if the claim did not appear in the OutputClaims section of the IDP.
                           In addition, if a claim is not in the InputClaims section, but it is in the OutputClaims section, then its
                           value will not be prefilled, but the user will still be prompted for it (with an empty value). -->
                      <InputClaim ClaimTypeReferenceId="displayName" />
                      <InputClaim ClaimTypeReferenceId="givenName" />
                      <InputClaim ClaimTypeReferenceId="surname" />
                    </InputClaims>
                    <!---User will be asked to input or update these values-->
                    <DisplayClaims>
                        <DisplayClaim ClaimTypeReferenceId="displayName"/>
                        <DisplayClaim ClaimTypeReferenceId="givenName"/>
                        <DisplayClaim ClaimTypeReferenceId="surname"/>
                    </DisplayClaims>

                    <OutputClaims>
                      <!-- These claims are not shown to the user because their value is obtained through the "ValidationTechnicalProfiles"
                           referenced below, or a default value is assigned to the claim. A claim is only shown to the user to provide a 
                           value if its value cannot be obtained through any other means. -->
                      <OutputClaim ClaimTypeReferenceId="objectId" />
                      <OutputClaim ClaimTypeReferenceId="newUser" />
                      <!---<OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />-->
          
                      <!-- Optional claims. These claims are collected from the user and can be modified. If a claim is to be persisted in the directory after having been 
                           collected from the user, it needs to be added as a PersistedClaim in the ValidationTechnicalProfile referenced below, i.e. 
                           in AAD-UserWriteUsingAlternativeSecurityId. -->
                      <OutputClaim ClaimTypeReferenceId="displayName" />
                      <OutputClaim ClaimTypeReferenceId="givenName" />
                      <OutputClaim ClaimTypeReferenceId="surname" />
                    </OutputClaims>
                    <ValidationTechnicalProfiles>
                      <ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingAlternativeSecurityId" />
                    </ValidationTechnicalProfiles>
                  </TechnicalProfile>
            </TechnicalProfiles>
        </ClaimsProvider>
    <!--</ClaimsProviders>-->

O provedor de sinistros que adicionamos contém um perfil técnico autodeclarado, SelfAsserted-Social. O perfil técnico autoafirmado usa o AAD-UserWriteUsingAlternativeSecurityId Perfil Técnico como um perfil técnico de validação. Assim, o Perfil Técnico é executado quando o usuário seleciona o AAD-UserWriteUsingAlternativeSecurityId botão Continuar (veja a captura de tela na etapa 7).

Além disso, observe que adicionamos a definição de conteúdo, , socialAccountsignupContentDefinitionque configuramos na etapa 3.5 na seção de metadados.

Etapa 4 - Atualizar as etapas de orquestração da jornada do usuário

No arquivo, localize a jornada do usuário e substitua todas as etapas de orquestração pelas etapas mostradas no código a ContosoCustomPolicy.XML HelloWorldJourney seguir:

    <!--<OrchestrationSteps>-->
        ...
        <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp">
            <ClaimsProviderSelections>
                <ClaimsProviderSelection TargetClaimsExchangeId="FacebookExchange" />
            </ClaimsProviderSelections>
        </OrchestrationStep>
    
        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="FacebookExchange"
                    TechnicalProfileReferenceId="Facebook-OAUTH" />
            </ClaimsExchanges>
        </OrchestrationStep>
    
        <!-- For social IDP authentication, attempt to find the user account in the
        directory. -->
        <OrchestrationStep Order="3" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="AADUserReadUsingAlternativeSecurityId" TechnicalProfileReferenceId="AAD-UserReadUsingAlternativeSecurityId" />
            </ClaimsExchanges>
        </OrchestrationStep>
    
        <!-- Show self-asserted page only if the directory does not have the user account
        already (i.e. we don't have an objectId).  -->
        <OrchestrationStep Order="4" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="SelfAsserted-Social" TechnicalProfileReferenceId="SelfAsserted-Social" />
            </ClaimsExchanges>
        </OrchestrationStep>
    
        <OrchestrationStep Order="5" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="AADUserWrite" TechnicalProfileReferenceId="AAD-UserWriteUsingAlternativeSecurityId" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="6" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    <!--</OrchestrationSteps>-->

Na orquestração, usamos fazer referência a perfis técnicos que permitem que um usuário faça login usando uma conta social.

Quando a política personalizada é executada:

  • Etapa de orquestração 1 - Esta etapa inclui um elemento que lista as opções de entrada disponíveis que um ClaimsProviderSelections usuário pode escolher. Nesse caso, temos apenas uma opção, portanto, quando a política é executada, os usuários são levados diretamente para Facebook.com na etapa 2, FacebookExchangeconforme mostrado pelo TargetClaimsExchangeId atributo.

  • Orquestração Passo 2 - O Facebook-OAUTH perfil técnico é executado, de modo que o usuário é redirecionado para o Facebook para entrar.

  • Orquestração Etapa 3 - Na etapa 3 , o AAD-UserReadUsingAlternativeSecurityId perfil técnico é executado para tentar ler a conta social do usuário do armazenamento de ID do Microsoft Entra. Se a conta social for encontrada, objectId será retornada como uma declaração de saída.

  • Etapa de orquestração 4 - Esta etapa é executada se o usuário ainda não existir (objectId não existe). Ele mostra o formulário que coleta mais informações do usuário ou atualiza informações semelhantes obtidas da conta social.

  • Etapa de orquestração 5 - Esta etapa é executada se o usuário ainda não existir (objectId não existe), então o AAD-UserWriteUsingAlternativeSecurityId Perfil Técnico é executado para gravar a conta social no Microsoft Entra ID.

  • Etapa de orquestração 6 - Finalmente, a etapa 6 monta e retorna o token JWT no final da execução da política.

Etapa 5 - Atualizar declarações de saída da terceira parte confiável

No arquivo, localize o ContosoCustomPolicy.XML RelyingParty elemento e, em seguida, substitua toda a coleção de declarações de saída pelo seguinte código:

    <OutputClaim ClaimTypeReferenceId="displayName" />
    <OutputClaim ClaimTypeReferenceId="givenName" />
    <OutputClaim ClaimTypeReferenceId="surname" />
    <OutputClaim ClaimTypeReferenceId="email" />
    <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
    <OutputClaim ClaimTypeReferenceId="identityProvider" />

Adicionamos o provedor de identidade (identityProvider) como uma declaração de saída, portanto, ele será incluído no token JWT retornado ao aplicativo de terceira parte confiável.

Passo 6 - Política de carregamento

Siga as etapas em Carregar arquivo de política personalizado para carregar seu arquivo de política. Se estiver a carregar um ficheiro com o mesmo nome que o que já se encontra no portal, certifique-se de que seleciona Substituir a política personalizada, caso já exista.

Etapa 7 - Política de teste

Siga as etapas em Testar a política personalizada para testar sua política personalizada.

Você será redirecionado para uma página de login do Facebook. Introduza as suas credenciais do Facebook e, em seguida, selecione Iniciar sessão. Você é redirecionado diretamente para o Facebook à medida que o definimos em nossas etapas de orquestração, já que não temos várias opções de login para escolher. Normalmente, em um aplicativo, você adiciona um botão como Entrar com o Facebook, que, quando selecionado, executa a política.

Se for a primeira vez que esta política é executada (a conta social ainda não existe no armazenamento do Microsoft Entra), você verá uma captura de tela como a mostrada abaixo. Você não verá essa tela em execuções de política subsequentes, pois a conta social já existe no armazenamento do Microsoft Entra.

Screenshot of sign-in flow with social account.

Introduza ou atualize o Nome a Apresentar, o Nome Próprio e o Apelido e, em seguida, selecione o botão Continuar.

Depois que a política terminar a execução, você será redirecionado para https://jwt.mso , e verá um token JWT decodificado. Ele é semelhante ao seguinte trecho de token JWT:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "pxLOMWFgP4T..."
}.{
   ...
  "acr": "b2c_1a_contosocustompolicy",
   ...
  "given_name": "Maurice",
  "family_name": "Paulet",
  "name": "Maurice Paulet",
  "email": "maurice.p@contoso.com",
  "idp": "facebook.com"
}.[Signature]

Observe que o provedor de identidade, , "idp": "facebook.com"foi incluído no token JWT.

Um login local e social combinado

Neste artigo, nossas etapas de orquestração da jornada do usuário fazem referência apenas a perfis técnicos que permitem que um usuário faça login usando uma conta social. Podemos modificar as etapas de orquestração para permitir que um usuário faça login usando uma conta local ou uma conta social. Para fazer isso, o elemento da primeira etapa de ClaimsProviderSelections orquestração lista as opções de entrada disponíveis para o usuário.

Use as seguintes etapas para adicionar uma conta local e social combinada:

  1. ContosoCustomPolicy.XML No arquivo, localize o perfil técnico autodeclarado e, em seguida, adicione authenticationSource declaração em sua coleção de declarações de saída usando o AccountTypeInputCollector seguinte código:

        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="localIdpAuthentication" AlwaysUseDefaultValue="true" />
    
  2. UserJourneys Na seção , adicione uma nova jornada do usuário, LocalAndSocialSignInAndSignUp usando o seguinte código:

        <!--<UserJourneys>-->
            ...
            <UserJourney Id="LocalAndSocialSignInAndSignUp">
                <OrchestrationSteps>
                    <!--Orchestration steps will be added here-->
                </OrchestrationSteps>
            </UserJourney>
        <!--</UserJourneys>-->
    
  3. Na jornada do usuário que você criou, LocalAndSocialSignInAndSignUpadicione etapas de orquestração usando o seguinte código:

        <!--<UserJourneys>
            ...
            <UserJourney Id="LocalAndSocialSignInAndSignUp">
                <OrchestrationSteps>-->
                <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="SignupOrSigninContentDefinition">
                    <ClaimsProviderSelections>
                      <ClaimsProviderSelection TargetClaimsExchangeId="FacebookExchange" />
                      <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" />
                    </ClaimsProviderSelections>
                    <ClaimsExchanges>
                      <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="UserSignInCollector" />
                    </ClaimsExchanges>
                </OrchestrationStep>
                <!-- Check if the user has selected to sign in using one of the social providers -->
                <OrchestrationStep Order="2" Type="ClaimsExchange">
                    <Preconditions>
                        <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                            <Value>objectId</Value>
                            <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                    </Preconditions>
                    <ClaimsExchanges>
                        <ClaimsExchange Id="FacebookExchange" TechnicalProfileReferenceId="Facebook-OAUTH" />
                        <ClaimsExchange Id="AccountTypeInputCollectorClaimsExchange" TechnicalProfileReferenceId="AccountTypeInputCollector"/>
                    </ClaimsExchanges>
                </OrchestrationStep>
    
                <!--For Local sign in option start-->
    
                <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>work</Value>
                          <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                            <Value>authenticationSource</Value>
                            <Value>socialIdpAuthentication</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>
                        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                            <Value>authenticationSource</Value>
                            <Value>socialIdpAuthentication</Value>
                            <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                    </Preconditions>
                    <ClaimsExchanges>
                        <ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="UserInformationCollector" />
                    </ClaimsExchanges>
                </OrchestrationStep>  
    
                <OrchestrationStep Order="5" Type="ClaimsExchange">
                    <Preconditions>
                        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                            <Value>authenticationSource</Value>
                            <Value>socialIdpAuthentication</Value>
                            <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                    </Preconditions>
                    <ClaimsExchanges>
                        <ClaimsExchange Id="AADUserReaderExchange" TechnicalProfileReferenceId="AAD-UserRead"/>
                    </ClaimsExchanges>
                </OrchestrationStep>                
                <!--For Local sign in option end-->
    
                <!--For social sign in option start-->
                <!-- For social IDP authentication, attempt to find the user account in the
                directory. -->
                <OrchestrationStep Order="6" Type="ClaimsExchange">
                   <Preconditions>
                    <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                        <Value>authenticationSource</Value>
                        <Value>localIdpAuthentication</Value>
                        <Action>SkipThisOrchestrationStep</Action>
                    </Precondition>
                   </Preconditions>
                    <ClaimsExchanges>
                        <ClaimsExchange Id="AADUserReadUsingAlternativeSecurityId" TechnicalProfileReferenceId="AAD-UserReadUsingAlternativeSecurityId" />
                    </ClaimsExchanges>
                </OrchestrationStep>
    
                <!-- Show self-asserted page only if the directory does not have the user account
                already (i.e. we do not have an objectId).  -->
                <OrchestrationStep Order="7" Type="ClaimsExchange">
                    <Preconditions>
                        <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                            <Value>objectId</Value>
                            <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                            <Value>authenticationSource</Value>
                            <Value>localIdpAuthentication</Value>
                            <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                    </Preconditions>
                    <ClaimsExchanges>
                        <ClaimsExchange Id="SelfAsserted-Social" TechnicalProfileReferenceId="SelfAsserted-Social" />
                    </ClaimsExchanges>
                </OrchestrationStep>
    
                <OrchestrationStep Order="8" Type="ClaimsExchange">
                    <Preconditions>
                        <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                            <Value>objectId</Value>
                            <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                            <Value>authenticationSource</Value>
                            <Value>localIdpAuthentication</Value>
                            <Action>SkipThisOrchestrationStep</Action>
                        </Precondition>
                    </Preconditions>
                    <ClaimsExchanges>
                        <ClaimsExchange Id="AADUserWrite" TechnicalProfileReferenceId="AAD-UserWriteUsingAlternativeSecurityId" />
                    </ClaimsExchanges>
                </OrchestrationStep>
                <!--For social sign in option end-->
                <OrchestrationStep Order="9" Type="ClaimsExchange">
                    <ClaimsExchanges>
                    <ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="UserInputMessageClaimGenerator"/>
                    </ClaimsExchanges>          
                </OrchestrationStep>
    
                <OrchestrationStep Order="10" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
               <!-- </OrchestrationSteps>
            </UserJourney>
        </UserJourneys>-->
    

    Na primeira etapa, especificamos as opções que um usuário precisa escolher em sua jornada, autenticação local ou social. Nas etapas a seguir, usamos pré-condições para rastrear a opção que o usuário escolheu ou o estágio da jornada em que o usuário está. Por exemplo, usamos a authenticationSource declaração para diferenciar entre uma jornada de autenticação local e uma jornada de autenticação social.

  4. RelyingParty Na seção , altere DefaultUserJourney'sReferenceId paraLocalAndSocialSignInAndSignUp

  5. Use o procedimento na etapa 6 e na etapa 7 para carregar e executar sua política. Depois de executar a política, você verá uma tela semelhante à captura de tela a seguir.

    A screenshot of combined local and social sign-up or sign-in interface.

    Você pode observar que um usuário pode se inscrever ou entrar usando uma conta local ou uma conta social.

Próximos passos