Raccogliere e modificare gli input utente usando criteri personalizzati di Azure Active Directory B2C
I criteri personalizzati di Azure Active Directory B2C (Azure AD B2C) consentono di raccogliere input utente. È quindi possibile usare metodi predefiniti per modificare gli input dell'utente.
Questo articolo illustra come scrivere un criterio personalizzato che raccoglie gli input utente tramite un'interfaccia utente grafica. Sarà quindi possibile accedere agli input, elaborare e infine restituirli come attestazioni in un token JWT. Per completare questa attività, è necessario:
Dichiarare le attestazioni. Un'attestazione fornisce un'archiviazione temporanea dei dati durante l'esecuzione dei criteri di Azure AD B2C. Può archiviare informazioni sull'utente, ad esempio nome, cognome o qualsiasi altra attestazione ottenuta dall'utente o da altri sistemi. Altre informazioni sulle attestazioni sono disponibili nella panoramica dei criteri personalizzati di Azure AD B2C.
Definire i profili tecnici. Un profilo tecnico fornisce un'interfaccia per comunicare con diversi tipi di parti. Ad esempio, consente di interagire con l'utente per raccogliere i dati.
Configurare le trasformazioni delle attestazioni, usate per modificare le attestazioni dichiarate.
Configurare le definizioni di contenuto. Una definizione di contenuto definisce l'interfaccia utente da caricare. In seguito è possibile personalizzare l'interfaccia utente fornendo contenuto HTML personalizzato.
Configurare e visualizzare le interfacce utente per l'utente usando profili tecnici autocertificati e DisplayClaims.
Chiamare i profili tecnici in una determinata sequenza usando i passaggi di orchestrazione.
Prerequisiti
In assenza di un tenant, creare un tenant di Azure AD B2C collegato alla sottoscrizione di Azure.
Registrare un'applicazione Web e abilitare la concessione implicita del token ID. Per l'URI di reindirizzamento, usare https://jwt.ms.
Nel computer deve essere installato Visual Studio Code (VS Code ).
Completare i passaggi descritti in Scrivere il primo criterio personalizzato di Azure AD B2C - Hello World!. Questo articolo fa parte della serie di procedure per creare ed eseguire criteri personalizzati.
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- Dichiarare attestazioni
Dichiarare attestazioni aggiuntive insieme a objectId e messaggio:
In VS Code aprire il
ContosoCustomPolicy.XML
file.ClaimsSchema
Nella sezione aggiungere le dichiarazioni ClaimType seguenti:<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>
Sono stati dichiarati tre tipi di attestazione, givenName, cognome e displayName. Queste dichiarazioni includono DataType
gli elementi e UserInputType
DisplayName
:
- DataType specifica il tipo di dati del valore che le attestazioni contengono. Altre informazioni sui tipi di dati supportati dagli elementi DataType.
- UserInputType specifica il controllo dell'interfaccia utente visualizzato nell'interfaccia utente se si vuole raccogliere il valore dell'attestazione dall'utente. Altre informazioni sui tipi di input utente supportati da Azure AD B2C.
- DisplayName specifica l'etichetta per il controllo dell'interfaccia utente visualizzato nell'interfaccia utente se si vuole raccogliere il valore dell'attestazione dall'utente.
Passaggio 2: Definire le trasformazioni delle attestazioni
ClaimsTransformation contiene una funzione usata per convertire una determinata attestazione in un'altra. Ad esempio, è possibile modificare un'attestazione stringa da lettere minuscole a maiuscole. Altre informazioni sulle trasformazioni delle attestazioni supportate da Azure AD B2C.
ContosoCustomPolicy.XML
Nel file aggiungere un<ClaimsTransformations>
elemento come elemento figlio dellaBuildingBlocks
sezione .<ClaimsTransformations> </ClaimsTransformations>
Aggiungere il codice seguente all'interno dell'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>
Sono stati configurati tre trasformazioni di attestazioni:
GenerateRandomObjectIdTransformation genera una stringa casuale come specificato dal metodo CreateRandomString . L'attestazione objectId viene aggiornata con la stringa generata come specificato dall'elemento
OutputClaim
.CreateDisplayNameTransformation concatena givenName e cognome per formare displayName.
CreateMessageTransformation concatena Hello e displayName per formare il messaggio.
Passaggio 3: Configurare le definizioni di contenuto
ContentDefinitions consente di specificare l'URL dei modelli HTML che controllano il layout delle pagine Web visualizzate agli utenti. È possibile specificare interfacce utente specifiche per ogni passaggio, ad esempio l'accesso o l'iscrizione, la reimpostazione della password o le pagine di errore.
Per aggiungere la definizione del contenuto, aggiungere il codice seguente nella BuildingBlocks
sezione del ContosoCustomPolicy.XML
file:
<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>
Passaggio 4: Configurare i profili tecnici
In un criterio personalizzato, technicalProfile è l'elemento che implementa la funzionalità. Dopo aver definito le trasformazioni attestazioni e attestazioni, sono necessari profili tecnici per eseguire le definizioni. Un profilo tecnico viene dichiarato all'interno degli ClaimsProvider
elementi.
Azure AD B2C offre un set di profili tecnici. Ogni profilo tecnico svolge un ruolo specifico. Ad esempio, si usa un profilo tecnico REST per effettuare una chiamata HTTP a un endpoint di servizio. È possibile usare un profilo tecnico di trasformazione delle attestazioni per eseguire l'operazione definita in una trasformazione delle attestazioni. Altre informazioni sui tipi di profili tecnici forniti dai criteri personalizzati di Azure AD B2C.
Impostare i valori per le attestazioni
Per impostare i valori per le attestazioni objectId, displayName e message, configurare un profilo tecnico che esegue le trasformazioni delle attestazioni GenerateRandomObjectIdTransformation, CreateDisplayNameTransformation e CreateMessageTransformation. Le trasformazioni delle attestazioni vengono eseguite dall'ordine definito nell'elemento OutputClaimsTransformations
. Ad esempio, crea prima il nome visualizzato, quindi il messaggio.
Aggiungere quanto segue
ClaimsProvider
come elemento figlio dellaClaimsProviders
sezione .<ClaimsProvider> <DisplayName>Technical Profiles to generate claims</DisplayName> </ClaimsProvider>
Per impostare i valori per le attestazioni objectId, displayName e message , aggiungere il codice seguente all'interno dell'elemento
ClaimsProvider
appena creato:<!--<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>-->
Raccogliere gli input utente
Si genera l'attestazione displayName da givenName e cognome, quindi è necessario raccogliere quindi come input dell'utente. Per raccogliere un input utente, si usa un tipo di profilo tecnico denominato Autocertificazione. Quando si configura un profilo tecnico autocertivi, è necessario fare riferimento alle definizioni di contenuto come profilo tecnico autocertificato è responsabile della visualizzazione di un'interfaccia utente.
Aggiungere quanto segue
ClaimsProvider
come elemento figlio dellaClaimsProviders
sezione .<ClaimsProvider> <DisplayName>Technical Profiles to collect user's details </DisplayName> </ClaimsProvider>
Aggiungere il codice seguente all'interno dell'elemento
ClaimsProvider
appena creato:<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>
Si notino le due attestazioni di visualizzazione per le attestazioni givenName e surname . Entrambe le attestazioni sono contrassegnate come necessarie, quindi l'utente deve immettere i valori prima di inviare il modulo visualizzato. Le attestazioni vengono visualizzate sullo schermo nell'ordine definito nell'elemento DisplayClaims , ad esempio Il nome specificato e quindi il cognome.
Passaggio 5- Definire i percorsi utente
Si usano percorsi utente per definire l'ordine in cui vengono chiamati i profili tecnici. Usare l'elemento OrchestrationSteps
per specificare i passaggi in un percorso utente.
Sostituire il contenuto esistente del HelloWorldJourney
percorso utente con il codice seguente:
<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>
In base ai passaggi di orchestrazione, vengono raccolti gli input utente, vengono impostati i valori per le attestazioni objectId, displayName e message e infine viene inviato il token Jwt.
Passaggio 6 - Aggiornare la relying party
Sostituire il contenuto dell'elemento OutputClaims
della RelyingParty
sezione con il codice seguente:
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="displayName"/>
<OutputClaim ClaimTypeReferenceId="message"/>
Al termine del passaggio 6, il ContosoCustomPolicy.XML
file dovrebbe essere simile al codice seguente:
<?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 non è già stato fatto, sostituire yourtenant
con la parte del sottodominio del nome del tenant, ad esempio contoso
. Informazioni su come ottenere il nome del tenant.
Passaggio 3 - Caricare un file di criteri personalizzato
Seguire la procedura descritta in Caricare un file di criteri personalizzato. 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 4- Testare i criteri personalizzati
In Criteri personalizzati selezionare B2C_1A_CONTOSOCUSTOMPOLICY.
Per Selezionare l'applicazione nella pagina di panoramica dei criteri personalizzati, selezionare l'applicazione Web, ad esempio webapp1 registrata in precedenza. Assicurarsi che il valore Select reply URL (Seleziona URL di risposta) sia impostato su
https://jwt.ms
.Selezionare Il pulsante Esegui adesso .
Immettere Il nome e il cognome specificati e quindi selezionare Continua.
Al termine dell'esecuzione del criterio, si viene reindirizzati a https://jwt.ms
e viene visualizzato un token JWT decodificato. È simile al frammento di token JWT seguente:
{
"typ": "JWT",
"alg": "RS256",
"kid": "pxLOMWFg...."
}.{
...
"sub": "c7ae4515-f7a7....",
...
"acr": "b2c_1a_contosocustompolicy",
...
"name": "Maurice Paulet",
"message": "Hello Maurice Paulet"
}.[Signature]
Passaggi successivi
A questo punto, vedere:
Informazioni sui tipi di profili tecnici nei criteri personalizzati di Azure AD B2C.
Come convalidare gli input utente usando criteri personalizzati.