Coletar e manipular as entradas de usuário usando a política personalizada do Azure Active Directory B2C
As políticas personalizadas do Azure Active Directory B2C (Azure AD B2C) permitem que você colete entradas de usuário. Você pode então usar métodos embutidos para manipular as entradas de usuário.
Neste artigo, você aprende como gravar uma política personalizada que coleta as entradas de usuário por meio de uma interface gráfica do usuário. Em seguida, você acessará as entradas, as processará e, finalmente, as retornará como declarações em um token JWT. Para concluir essa tarefa, você irá:
Declarar as declarações. Uma declaração fornece armazenamento temporário de dados durante uma execução de política do Azure AD B2C. Ele pode armazenar informações sobre o usuário, como nome, sobrenome ou qualquer outra declaração obtida do usuário ou de outros sistemas. Você pode saber mais sobre as declarações na visão geral da política personalizada do Azure Active Directory B2C.
Definir os perfis técnicos. Um perfil técnico fornece uma interface para se comunicar com diferentes tipos de partes. Por exemplo, permitir que você interaja com o usuário para coletar dados.
Configure as transformações das declarações, que você usa para manipular as declarações declaradas.
Configurar as definições de conteúdo. Uma definição de conteúdo define a interface do usuário que será carregada. Mais tarde, você pode personalizar a interface do usuário fornecendo seu próprio conteúdo HTML personalizado.
Configure e mostre as interfaces do usuário para o usuário usando Perfis Técnicos Autodeclarados e DisplayClaims.
Chame os Perfis Técnicos em uma determinada sequência utilizando as Etapas de Orquestração.
Pré-requisitos
Se ainda não tiver um, você precisará criar um locatário do Azure AD B2C que esteja vinculado à sua assinatura do Azure.
Registre um aplicativo Web e habilite a concessão implícita de token de ID. Para o URI de redirecionamento, use https://jwt.ms.
Você deve ter o Visual Studio Code (VS Code) instalado em seu computador.
Conclua as etapas em Escreva sua primeira política personalizada do Azure Active Directory B2C. Olá, Mundo!. Este artigo faz parte da série de guias Criar e executar suas próprias políticas personalizadas.
Observação
Este artigo faz parte da série de guias de instruções Criar e executar suas próprias políticas personalizadas no Azure Active Directory B2C. Recomendamos que você comece essa série com o primeiro artigo.
Etapa 1 - Declarar as Declarações
Declare declarações adicionais ao lado de objectId e message:
No VS Code, abra o arquivo
ContosoCustomPolicy.XML
.Na seção
ClaimsSchema
, adicione as declarações ClaimType a seguir:<ClaimType Id="givenName"> <DisplayName>Given Name</DisplayName> <DataType>string</DataType> <UserHelpText>Your given name (also known as first name).</UserHelpText> <UserInputType>TextBox</UserInputType> </ClaimType> <ClaimType Id="surname"> <DisplayName>Surname</DisplayName> <DataType>string</DataType> <UserHelpText>Your surname (also known as family name or last name).</UserHelpText> <UserInputType>TextBox</UserInputType> </ClaimType> <ClaimType Id="displayName"> <DisplayName>Display Name</DisplayName> <DataType>string</DataType> <UserHelpText>Your display name.</UserHelpText> <UserInputType>TextBox</UserInputType> </ClaimType>
Declaramos três Tipos de Declaração, givenName, surname e displayName. Essas declarações incluem DataType
, UserInputType
e DisplayName
elementos:
- DataType especifica o tipo de dados do valor que as declarações possuem. Saiba mais sobre os tipos de dados que os elementos DataType suportam.
- UserInputType especifica o controle da interface do usuário que aparece na interface do usuário se você desejar coletar o valor da declaração do usuário. Saiba mais sobre os tipos de entrada de usuário que o Azure AD B2C suporta.
- DisplayName especifica o rótulo do controle da interface do usuário que aparece na interface do usuário se você desejar coletar o valor da declaração do usuário.
Etapa 2 - Definir as transformações da declaração
Uma ClaimsTransformation contém uma função que você utiliza para converter uma determinada declaração em outra. Por exemplo, você pode alterar uma declaração de cadeia de caracteres de minúsculas para maiúsculas. Saiba mais sobre as Transformações das declarações suportadas pelo Azure AD B2C.
No arquivo
ContosoCustomPolicy.XML
, adicione um elemento<ClaimsTransformations>
como filho da seçãoBuildingBlocks
.<ClaimsTransformations> </ClaimsTransformations>
Adicione o seguinte código dentro do elemento
ClaimsTransformations
:<ClaimsTransformation Id="GenerateRandomObjectIdTransformation" TransformationMethod="CreateRandomString"> <InputParameters> <InputParameter Id="randomGeneratorType" DataType="string" Value="GUID"/> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="outputClaim"/> </OutputClaims> </ClaimsTransformation> <ClaimsTransformation Id="CreateDisplayNameTransformation" TransformationMethod="FormatStringMultipleClaims"> <InputClaims> <InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="inputClaim1"/> <InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="inputClaim2"/> </InputClaims> <InputParameters> <InputParameter Id="stringFormat" DataType="string" Value="{0} {1}"/> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="outputClaim"/> </OutputClaims> </ClaimsTransformation> <ClaimsTransformation Id="CreateMessageTransformation" TransformationMethod="FormatStringClaim"> <InputClaims> <InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim"/> </InputClaims> <InputParameters> <InputParameter Id="stringFormat" DataType="string" Value="Hello {0}"/> </InputParameters> <OutputClaims> <OutputClaim ClaimTypeReferenceId="message" TransformationClaimType="outputClaim"/> </OutputClaims> </ClaimsTransformation>
Configuramos três transformações de declarações:
GenerateRandomObjectIdTransformation gera uma cadeia de caracteres aleatória conforme especificado pelo método CreateRandomString. A declaração objectId é atualizada com a cadeia de caracteres gerada, conforme especificado pelo elemento
OutputClaim
.CreateDisplayNameTransformation concatena givenName e surname para formar displayName.
CreateMessageTransformation concatena Olá e displayName para formar mensagem.
Etapa 3 - Configurar as definições de conteúdo
ContentDefinitions permite especificar a URL para modelos HTML que controlam o layout das páginas da Web que você mostra para seus usuários. Você pode especificar interfaces de usuário específicas para cada etapa, tais como entrada ou inscrição, redefinição de senha ou páginas de erro.
Para adicionar a definição de conteúdo, adicione o seguinte código na seção BuildingBlocks
do arquivo ContosoCustomPolicy.XML
:
<ContentDefinitions>
<ContentDefinition Id="SelfAssertedContentDefinition">
<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>
</ContentDefinition>
</ContentDefinitions>
Etapa 4 - Configurar os perfis técnicos
Em uma política personalizada, um TechnicalProfile é o elemento que implementa a funcionalidade. Agora que você definiu as Declarações e Transformações de Declarações, você precisa dos Perfis Técnicos para executar suas definições. Um perfil técnico está declarado dentro de ClaimsProvider
elementos.
O Azure Active Directory B2C fornece um conjunto de perfis técnicos. Cada perfil técnico desempenha uma função específica. Por exemplo, você usa um perfil técnico REST para fazer uma chamada HTTP para um ponto de extremidade de serviço. Você pode usar um perfil técnico de transformação de declarações para executar a operação definida em uma Transformação de Declarações. Saiba mais sobre os tipos de perfis técnicos que as políticas personalizadas do Azure Active Directory B2C fornecem.
Defina valores para suas declarações
Para definir os valores das declarações objectId, displayName e message, você configura um perfil técnico que executa as transformações de declarações GenerateRandomObjectIdTransformation, CreateDisplayNameTransformation e CreateMessageTransformation. As transformações das declarações são executadas pela ordem definida no elemento OutputClaimsTransformations
. Por exemplo, primeiro ele cria o nome de exibição e, em seguida, a mensagem.
Adicione o seguinte
ClaimsProvider
como um filho da seçãoClaimsProviders
.<ClaimsProvider> <DisplayName>Technical Profiles to generate claims</DisplayName> </ClaimsProvider>
Para definir os valores das declarações objectId, displayName e message, adicione o seguinte código dentro do elemento
ClaimsProvider
que você acabou de criar:<!--<ClaimsProvider>--> <TechnicalProfiles> <TechnicalProfile Id="ClaimGenerator"> <DisplayName>Generate Object ID, displayName and message Claims Technical Profile.</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId"/> <OutputClaim ClaimTypeReferenceId="displayName"/> <OutputClaim ClaimTypeReferenceId="message"/> </OutputClaims> <OutputClaimsTransformations> <OutputClaimsTransformation ReferenceId="GenerateRandomObjectIdTransformation"/> <OutputClaimsTransformation ReferenceId="CreateDisplayNameTransformation"/> <OutputClaimsTransformation ReferenceId="CreateMessageTransformation"/> </OutputClaimsTransformations> </TechnicalProfile> </TechnicalProfiles> <!--</ClaimsProvider>-->
Coletar as entradas de usuário
Você gera a declaração displayName de givenName e surname, então você precisa coletar como entradas de usuário. Para coletar uma entrada de usuário, você utiliza um tipo de perfil técnico chamado Autodeclarado. Ao configurar um perfil técnico autodeclarado, você precisa fazer referência às definições de conteúdo, pois o perfil técnico autodeclarado é responsável por exibir uma interface do usuário.
Adicione o seguinte
ClaimsProvider
como um filho da seçãoClaimsProviders
.<ClaimsProvider> <DisplayName>Technical Profiles to collect user's details </DisplayName> </ClaimsProvider>
Adicione o seguinte código dentro do elemento
ClaimsProvider
que você acabou de criar:<TechnicalProfiles> <TechnicalProfile Id="UserInformationCollector"> <DisplayName>Collect User Input Technical Profile</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> <Metadata> <Item Key="ContentDefinitionReferenceId">SelfAssertedContentDefinition</Item> </Metadata> <DisplayClaims> <DisplayClaim ClaimTypeReferenceId="givenName" Required="true"/> <DisplayClaim ClaimTypeReferenceId="surname" Required="true"/> </DisplayClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="givenName"/> <OutputClaim ClaimTypeReferenceId="surname"/> </OutputClaims> </TechnicalProfile> </TechnicalProfiles>
Observe as duas declarações de exibição para as declarações givenName e surname. Ambas as declarações estão marcadas como obrigatórias, portanto, o usuário deve inserir os valores antes de enviar o formulário exibido a eles. As declarações são exibidas na tela na ordem definida no elemento DisplayClaims, como o Nome e, em seguida, o Sobrenome.
Etapa 5 - Definir os percursos do usuário
Você usa os percursos do usuário para definir a ordem em que os perfis técnicos são chamados. Você usa o elemento OrchestrationSteps
para especificar as etapas em um percurso do usuário.
Substitua o conteúdo existente do Percurso do Usuário HelloWorldJourney
pelo seguinte código:
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="GetUserInformationClaimsExchange" TechnicalProfileReferenceId="UserInformationCollector"/>
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="ClaimGenerator"/>
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer"/>
</OrchestrationSteps>
De acordo com as etapas de orquestração, coletamos as entradas de usuário, definimos os valores das declarações objectId, displayName e message e, finalmente, enviamos o token JWT.
Etapa 6 - Atualizar a terceira parte confiável
Substitua o conteúdo do elemento OutputClaims
da seção RelyingParty
pelo seguinte código:
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="displayName"/>
<OutputClaim ClaimTypeReferenceId="message"/>
Após a concluída a etapa 6, o arquivo ContosoCustomPolicy.XML
deverá parecer com o seguinte código:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TrustFrameworkPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06"
PolicySchemaVersion="0.3.0.0" TenantId="yourtenant.onmicrosoft.com"
PolicyId="B2C_1A_ContosoCustomPolicy"
PublicPolicyUri="http://yourtenant.onmicrosoft.com/B2C_1A_ContosoCustomPolicy">
<BuildingBlocks>
<ClaimsSchema>
<ClaimType Id="objectId">
<DisplayName>unique object Id for subject of the claims being returned</DisplayName>
<DataType>string</DataType>
</ClaimType>
<ClaimType Id="message">
<DisplayName>Will hold Hello World message</DisplayName>
<DataType>string</DataType>
</ClaimType>
<ClaimType Id="givenName">
<DisplayName>Given Name</DisplayName>
<DataType>string</DataType>
<UserHelpText>Your given name (also known as first name).</UserHelpText>
<UserInputType>TextBox</UserInputType>
</ClaimType>
<ClaimType Id="surname">
<DisplayName>Surname</DisplayName>
<DataType>string</DataType>
<UserHelpText>Your surname (also known as family name or last name).</UserHelpText>
<UserInputType>TextBox</UserInputType>
</ClaimType>
<ClaimType Id="displayName">
<DisplayName>Display Name</DisplayName>
<DataType>string</DataType>
<UserHelpText>Your display name.</UserHelpText>
<UserInputType>TextBox</UserInputType>
</ClaimType>
</ClaimsSchema>
<ClaimsTransformations>
<ClaimsTransformation Id="GenerateRandomObjectIdTransformation" TransformationMethod="CreateRandomString">
<InputParameters>
<InputParameter Id="randomGeneratorType" DataType="string" Value="GUID"/>
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="outputClaim"/>
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="CreateDisplayNameTransformation" TransformationMethod="FormatStringMultipleClaims">
<InputClaims>
<InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="inputClaim1"/>
<InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="inputClaim2"/>
</InputClaims>
<InputParameters>
<InputParameter Id="stringFormat" DataType="string" Value="{0} {1}"/>
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="outputClaim"/>
</OutputClaims>
</ClaimsTransformation>
<ClaimsTransformation Id="CreateMessageTransformation" TransformationMethod="FormatStringClaim">
<InputClaims>
<InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim"/>
</InputClaims>
<InputParameters>
<InputParameter Id="stringFormat" DataType="string" Value="Hello {0}"/>
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="message" TransformationClaimType="outputClaim"/>
</OutputClaims>
</ClaimsTransformation>
</ClaimsTransformations>
<ContentDefinitions>
<ContentDefinition Id="SelfAssertedContentDefinition">
<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>
</ContentDefinition>
</ContentDefinitions>
</BuildingBlocks>
<!--Claims Providers Here-->
<ClaimsProviders>
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="JwtIssuer">
<DisplayName>JWT Issuer</DisplayName>
<Protocol Name="None"/>
<OutputTokenFormat>JWT</OutputTokenFormat>
<Metadata>
<Item Key="client_id">{service:te}</Item>
<Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>
<Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>
</Metadata>
<CryptographicKeys>
<Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer"/>
<Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer"/>
</CryptographicKeys>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
<ClaimsProvider>
<DisplayName>Trustframework Policy Engine TechnicalProfiles</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="TpEngine_c3bd4fe2-1775-4013-b91d-35f16d377d13">
<DisplayName>Trustframework Policy Engine Default Technical Profile</DisplayName>
<Protocol Name="None"/>
<Metadata>
<Item Key="url">{service:te}</Item>
</Metadata>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
<ClaimsProvider>
<DisplayName>Claim Generator Technical Profiles</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="ClaimGenerator">
<DisplayName>Generate Object ID, displayName and message Claims Technical Profile.</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId"/>
<OutputClaim ClaimTypeReferenceId="displayName"/>
<OutputClaim ClaimTypeReferenceId="message"/>
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="GenerateRandomObjectIdTransformation"/>
<OutputClaimsTransformation ReferenceId="CreateDisplayNameTransformation"/>
<OutputClaimsTransformation ReferenceId="CreateMessageTransformation"/>
</OutputClaimsTransformations>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
<ClaimsProvider>
<DisplayName>Technical Profiles to collect user's details</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="UserInformationCollector">
<DisplayName>Collect User Input Technical Profile</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<Metadata>
<Item Key="ContentDefinitionReferenceId">SelfAssertedContentDefinition</Item>
</Metadata>
<DisplayClaims>
<DisplayClaim ClaimTypeReferenceId="givenName" Required="true"/>
<DisplayClaim ClaimTypeReferenceId="surname" Required="true"/>
</DisplayClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="givenName"/>
<OutputClaim ClaimTypeReferenceId="surname"/>
</OutputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
</ClaimsProviders>
<UserJourneys>
<UserJourney Id="HelloWorldJourney">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="GetUserInformationClaimsExchange" TechnicalProfileReferenceId="UserInformationCollector"/>
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="ClaimGenerator"/>
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer"/>
</OrchestrationSteps>
</UserJourney>
</UserJourneys>
<RelyingParty><!--
Relying Party Here that's your policy’s entry point
Specify the User Journey to execute
Specify the claims to include in the token that is returned when the policy runs
-->
<DefaultUserJourney ReferenceId="HelloWorldJourney"/>
<TechnicalProfile Id="HelloWorldPolicyProfile">
<DisplayName>Hello World Policy Profile</DisplayName>
<Protocol Name="OpenIdConnect"/>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="displayName"/>
<OutputClaim ClaimTypeReferenceId="message"/>
</OutputClaims>
<SubjectNamingInfo ClaimType="sub"/>
</TechnicalProfile>
</RelyingParty>
</TrustFrameworkPolicy>
Se ainda não tiver feito isso, substitua yourtenant
pela parte do subdomínio do nome do locatário, como contoso
. Saiba como Obter o nome do locatário.
Etapa 3 - Carregar o arquivo da política personalizada
Siga as etapas em Carregar arquivo de política personalizado. Se você estiver carregando um arquivo com o mesmo nome que o que já está no portal, selecione Substituir a política personalizada se ela já existir.
Etapa 4 - Testar a política personalizada
Em Políticas personalizadas, selecione B2C_1A_CONTOSOCUSTOMPOLICY.
Em Selecionar aplicativo na página de visão geral da política personalizada, selecione o aplicativo Web chamado webapp1 que você registrou anteriormente. Verifique se o valor Selecionar URL de resposta está definido como
https://jwt.ms
.Selecione o botão Executar agora.
Digite Nome e Sobrenome e selecione Continuar.
Depois que a política concluir a execução, você será redirecionado para https://jwt.ms
e verá um token JWT decodificado. Ele se parece com o seguinte trecho do token JWT:
{
"typ": "JWT",
"alg": "RS256",
"kid": "pxLOMWFg...."
}.{
...
"sub": "c7ae4515-f7a7....",
...
"acr": "b2c_1a_contosocustompolicy",
...
"name": "Maurice Paulet",
"message": "Hello Maurice Paulet"
}.[Signature]
Próximas etapas
Em seguida, aprenda:
Sobre os tipos de Perfis Técnicos nas políticas personalizadas do Azure AD B2C.
Como validar as entradas de usuário usando a política personalizada .