Recopilar y gestionar entradas de usuario mediante la directiva personalizada de Azure Active Directory B2C
Las directivas personalizadas de Azure Active Directory B2C (Azure AD B2C) permiten recopilar entradas de usuario. A continuación, puede usar métodos integrados para gestionar las entradas de usuario.
En este artículo, aprenderá a escribir una directiva personalizada que recopile entradas de usuario mediante una interfaz gráfica de usuario. Después, accederá a las entradas, las procesará y, finalmente, las devolverá como notificaciones en un token JWT. Para completar esta tarea, hará lo siguiente:
Declarar notificaciones. Una notificación proporciona un almacenamiento temporal de datos durante la ejecución de una directiva de Azure AD B2C. Puede almacenar información sobre el usuario, como el nombre, el apellido o cualquier otra notificación obtenida del usuario u otros sistemas. Puede obtener más información sobre las notificaciones en Información general de la directiva personalizada de Azure AD B2C.
Definir perfiles técnicos. Un perfil técnico proporciona una interfaz para comunicarse con distintos tipos de entidades. Por ejemplo, permite interactuar con el usuario para recopilar datos.
Configure las transformaciones de notificaciones que se usan para manipular las notificaciones que declara.
Configurar definiciones de contenido. Una definición de contenido define la interfaz de usuario que se va a cargar. Más adelante puede personalizar la interfaz de usuario proporcionando su propio contenido HTML personalizado.
Configure y muestre interfaces de usuario para el usuario mediante perfiles técnicos autoafirmados y DisplayClaims.
Llame a perfiles técnicos en una secuencia determinada mediante pasos de orquestación.
Requisitos previos
Si todavía no tiene uno, cree un inquilino de Azure AD B2C vinculado a la suscripción de Azure.
Registre una aplicación web y habilite la concesión implícita del token de identificador. Para el URI de redirección, use https://jwt.ms.
Debe tener Visual Studio Code (VS Code) instalado en el equipo.
Complete los pasos descritos en Escritura de la primera directiva personalizada de Azure AD B2C: Hola mundo. Este artículo forma parte de la serie de guías paso a paso Creación y ejecución sus propias directivas personalizadas.
Nota
Este artículo forma parte de la Serie de guías paso a paso para crear y ejecutar sus propias directivas personalizadas en Azure Active Directory B2C. Le recomendamos que empiece esta serie por el primer artículo.
Paso 1: Declarar notificaciones
Declare notificaciones adicionales junto con objectId y message:
En VS Code, abra el archivo
ContosoCustomPolicy.XML
.En la sección
ClaimsSchema
, añada las siguientes declaraciones 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>
Hemos declarado tres tipos de notificación, givenName, surname y displayName. Estas declaraciones incluyen elementos DataType
, UserInputType
y DisplayName
:
- DataType especifica el tipo de datos del valor que contienen las notificaciones. Obtenga más información sobre los tipos de datos que admiten los elementos DataType.
- UserInputType especifica el control de interfaz de usuario que aparece en la interfaz de usuario si desea recopilar el valor de la notificación del usuario. Obtenga más información sobre los tipos de entrada de usuario que admite Azure AD B2C.
- DisplayName especifica la etiqueta del control de interfaz de usuario que aparece en la interfaz de usuario si desea recopilar el valor de la notificación del usuario.
Paso 2: Definición de las transformaciones de notificaciones
ClaimsTransformation contiene una función que se usa para convertir una notificación determinada en otra. Por ejemplo, puede cambiar una notificación de cadena de minúsculas a mayúsculas. Obtenga más información sobre las transformaciones de notificaciones compatibles con Azure AD B2C.
En el archivo
BuildingBlocks
, agregue un elementoContosoCustomPolicy.XML
como elemento secundario de<ClaimsTransformations>
.<ClaimsTransformations> </ClaimsTransformations>
Agregue el siguiente código dentro del 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>
Hemos configurado tres transformaciones de notificaciones:
GenerateRandomObjectIdTransformation genera una cadena aleatoria según lo especificado por el método CreateRandomString. La notificación objectId se actualiza con la cadena generada según lo especificado por el elemento
OutputClaim
.CreateDisplayNameTransformation concatena givenName y surname para formar displayName.
CreateMessageTransformation concatena Hello y displayName para formar message.
Paso 3: Configuración de definiciones de contenido
ContentDefinitions permite especificar la dirección URL a las plantillas HTML que controlan el diseño de las páginas web que se muestran a los usuarios. Puede especificar interfaces de usuario específicas para cada paso, como el inicio de sesión o el registro, el restablecimiento de contraseña o las páginas de error.
Para agregar la definición de contenido, agregue el código siguiente en la sección BuildingBlocks
del archivo 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>
Paso 4: Configuración de perfiles técnicos
En una directiva personalizada, TechnicalProfile es el elemento que implementa la funcionalidad. Ahora que ha definido las transformaciones de notificaciones y las notificaciones, necesita perfiles técnicos para ejecutar las definiciones. Un perfil técnico se declara dentro de los elementos ClaimsProvider
.
Azure AD B2C proporciona un conjunto de perfiles técnicos. Cada perfil técnico realiza un rol específico. Por ejemplo, se usa un perfil técnico de REST para realizar una llamada HTTP a un punto de conexión de servicio. Puede usar un perfil técnico de transformación de notificaciones para ejecutar la operación que defina en una transformación de notificaciones. Obtenga más información sobre los tipos de perfiles técnicos que proporcionan las directivas personalizadas de Azure AD B2C.
Establecimiento de valores para las notificaciones
Para establecer valores para las notificaciones objectId, displayName y message, configure un perfil técnico que ejecute las transformaciones de notificaciones GenerateRandomObjectIdTransformation, CreateDisplayNameTransformation y CreateMessageTransformation. Las transformaciones de notificaciones se ejecutan mediante el orden definido en el elemento OutputClaimsTransformations
. Por ejemplo, primero crea el nombre para mostrar y, a continuación, el mensaje.
Agregue el siguiente
ClaimsProviders
como elemento secundario de la secciónClaimsProvider
.<ClaimsProvider> <DisplayName>Technical Profiles to generate claims</DisplayName> </ClaimsProvider>
Para establecer valores para las notificaciones objectId, displayName y message, agregue el código siguiente dentro del elemento
ClaimsProvider
que acaba de crear:<!--<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>-->
Recopilación de entradas de usuario
La notificación displayName se genera a partir de givenName y surname, por lo que debe recopilarla como entradas de usuario. Para recopilar una entrada de usuario, use un tipo de perfil técnico denominado autoafirmado. Al configurar un perfil técnico autoafirmado, es necesario hacer referencia a las definiciones de contenido, ya que el perfil técnico autoafirmado es responsable de mostrar una interfaz de usuario.
Agregue el siguiente
ClaimsProviders
como elemento secundario de la secciónClaimsProvider
.<ClaimsProvider> <DisplayName>Technical Profiles to collect user's details </DisplayName> </ClaimsProvider>
Agregue el código siguiente dentro del elemento
ClaimsProvider
que acaba de crear:<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 las dos notificaciones de presentación para las notificaciones givenName y surname. Ambas notificaciones se marcan como necesarias, por lo que el usuario debe escribir los valores antes de enviar el formulario que se le muestra. Las notificaciones se muestran en la pantalla en el orden definido en el elemento DisplayClaims, como, el GivenName y, a continuación, el Surname.
Paso 5: Definición de los recorridos del usuario
Los recorridos del usuario se usan para definir el orden en el que se llama a los perfiles técnicos. Use el elemento OrchestrationSteps
para especificar los pasos de un recorrido del usuario.
Reemplace el contenido existente del recorrido del usuario HelloWorldJourney
por el código siguiente:
<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>
Según los pasos de orquestación, recopilamos entradas de usuario, establecemos valores para las notificaciones objectId, displayName y message y, por último, envíamos el token Jwt.
Paso 6: Actualización del usuario de confianza
Reemplace el contenido del elemento OutputClaims
de la sección RelyingParty
por el código siguiente:
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="displayName"/>
<OutputClaim ClaimTypeReferenceId="message"/>
Después de completar el paso 6, el archivo ContosoCustomPolicy.XML
debe ser similar al código siguiente:
<?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>
Si aún no lo ha hecho, reemplace por yourtenant
la parte de subdominio del nombre del inquilino, como contoso
. Obtenga información sobre la Obtención del nombre del inquilino.
Paso 3: Carga del archivo de directiva personalizado
Siga los pasos descritos en Carga del archivo de directiva personalizado. Si va a cargar un archivo con el mismo nombre que el que ya está en el portal, asegúrese de seleccionar Sobrescribir la directiva personalizada si ya existe.
Paso 4: Prueba de la directiva personalizada
En Directivas personalizadas, seleccione B2C_1A_CONTOSOCUSTOMPOLICY.
Para Seleccionar aplicación en la página Información general de la directiva personalizada, seleccione la aplicación web como webapp1 que ha registrado antes. Asegúrese de que el valor Seleccionar dirección URL de respuesta está establecido en
https://jwt.ms
.Seleccione el botón Ejecutar ahora.
Escriba el GivenName y el Surname especificados y, a continuación, seleccione Continuar.
Una vez finalizada la ejecución de la directiva, se le redirigirá a https://jwt.ms
y verá un token JWT descodificado. Tiene un aspecto similar al siguiente fragmento de código de token JWT:
{
"typ": "JWT",
"alg": "RS256",
"kid": "pxLOMWFg...."
}.{
...
"sub": "c7ae4515-f7a7....",
...
"acr": "b2c_1a_contosocustompolicy",
...
"name": "Maurice Paulet",
"message": "Hello Maurice Paulet"
}.[Signature]
Pasos siguientes
A continuación, aprenda:
Acerca de los tipos de perfiles técnicos en las directivas personalizadas de Azure AD B2C.
Cómo validar las entradas de usuario mediante la directiva personalizada.