Shromažďování uživatelských vstupů a manipulace s nimi pomocí vlastních zásad Azure Active Directory B2C
Vlastní zásady Azure Active Directory B2C (Azure AD B2C) umožňují shromažďovat vstupy uživatelů. Pak můžete použít inbuilt metody pro manipulaci se vstupy uživatele.
V tomto článku se dozvíte, jak napsat vlastní zásady, které shromažďují vstupy uživatelů prostřednictvím grafického uživatelského rozhraní. Pak budete přistupovat ke vstupům, zpracovat je a nakonec je vrátit jako deklarace identity v tokenu JWT. K dokončení tohoto úkolu:
Deklarujte deklarace identity. Deklarace identity poskytuje dočasné úložiště dat během provádění zásad Azure AD B2C. Může ukládat informace o uživateli, jako je jméno, příjmení nebo jakákoli jiná deklarace identity získaná uživatelem nebo jinými systémy. Další informace o deklarací identity najdete v přehledu vlastních zásad Azure AD B2C.
Definujte technické profily. Technický profil poskytuje rozhraní pro komunikaci s různými typy stran. Umožňuje například interakci s uživatelem a shromažďovat data.
Nakonfigurujte transformace deklarací identity, které používáte k manipulaci s deklaracemi identity.
Nakonfigurujte definice obsahu. Definice obsahu definuje uživatelské rozhraní, které se má načíst. Později můžete uživatelské rozhraní přizpůsobit tak, že poskytnete vlastní přizpůsobený obsah HTML.
Nakonfigurujte a zobrazte uživatelská rozhraní pro uživatele pomocí technických profilů a displayClaims.
Volání technických profilů v dané sekvenci pomocí kroků orchestrace
Předpoklady
Pokud ho ještě nemáte, vytvořte tenanta Azure AD B2C, který je propojený s vaším předplatným Azure.
Zaregistrujte webovou aplikaci a povolte implicitní udělení tokenu ID. Pro identifikátor URI přesměrování použijte https://jwt.ms.
V počítači musíte mít nainstalovaný Visual Studio Code (VS Code ).
Dokončete kroky v tématu Psaní první vlastní zásady Azure AD B2C – Hello World!. Tento článek je součástí vytváření a spouštění vlastních zásad, které vás provedou řadou návodů.
Poznámka:
Tento článek je součástí řady s návody k vytvoření a spuštění vlastních zásad v Azure Active Directory B2C. Doporučujeme spustit tuto řadu z prvního článku.
Krok 1 – Deklarace deklarací identity
Deklarujte další deklarace identity společně s objectId a zprávou:
V editoru
ContosoCustomPolicy.XML
VS Code otevřete soubor.ClaimsSchema
V části přidejte následující deklarace 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>
Deklarovali jsme tři typy deklarací identity, givenName, příjmení a displayName. Mezi tyto deklarace patří DataType
UserInputType
a DisplayName
prvky:
- Datový typ určuje datový typ hodnoty, kterou deklarace identity uchovávají. Přečtěte si další informace o datových typech, které prvky DataType podporují.
- UserInputType určuje ovládací prvek uživatelského rozhraní, který se zobrazí v uživatelském rozhraní, pokud chcete shromáždit hodnotu deklarace identity od uživatele. Přečtěte si další informace o typech uživatelských vstupů, které Azure AD B2C podporuje.
- DisplayName určuje popisek ovládacího prvku uživatelského rozhraní, který se zobrazí v uživatelském rozhraní, pokud chcete shromáždit hodnotu deklarace identity od uživatele.
Krok 2 : Definování transformací deklarací identity
Deklarace IdentityTransformation obsahuje funkci, kterou použijete k převodu dané deklarace na jinou. Můžete například změnit deklaraci řetězce z malých písmen na velká písmena. Přečtěte si další informace o transformacích deklarací identity podporovaných službou Azure AD B2C.
ContosoCustomPolicy.XML
V souboru přidejte<ClaimsTransformations>
prvek jako podřízenou částBuildingBlocks
.<ClaimsTransformations> </ClaimsTransformations>
Do elementu
ClaimsTransformations
přidejte následující kód:<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>
Nakonfigurovali jsme tři transformace deklarací identity:
GenerateRandomObjectIdTransformation generuje náhodný řetězec zadaný Metodou CreateRandomString . Deklarace identity objectId se aktualizuje o vygenerovaný řetězec, jak je určeno elementem
OutputClaim
.CreateDisplayNameTransformation zřetězí givenName a příjmení pro formulář displayName.
CreateMessageTransformation zřetězí Hello a displayName pro vytvoření zprávy.
Krok 3 – Konfigurace definic obsahu
ContentDefinitions umožňuje zadat adresu URL šablon HTML, které řídí rozložení webových stránek, které se zobrazují uživatelům. Pro každý krok můžete zadat konkrétní uživatelská rozhraní, jako je přihlášení nebo registrace, resetování hesla nebo chybové stránky.
Pokud chcete přidat definici obsahu, přidejte do BuildingBlocks
části ContosoCustomPolicy.XML
souboru následující kód:
<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>
Krok 4 – Konfigurace technických profilů
Ve vlastních zásadách je TechnicalProfile element, který implementuje funkce. Teď, když jste definovali deklarace identity a transformace deklarací identity, potřebujete k provedení definic technické profily. Technický profil je deklarován uvnitř ClaimsProvider
prvků.
Azure AD B2C poskytuje sadu technických profilů. Každý technický profil provádí určitou roli. K volání koncového bodu služby například použijete technický profil REST. K provedení operace, kterou definujete v transformaci deklarací identity, můžete použít technický profil transformace deklarací identity. Přečtěte si další informace o typech technických profilů , které poskytují vlastní zásady Azure AD B2C.
Nastavení hodnot pro deklarace identity
Chcete-li nastavit hodnoty pro objectId, displayName a message deklarace identity, nakonfigurujete technický profil, který spouští GenerateRandomObjectIdTransformation, CreateDisplayNameTransformation a CreateMessageTransformation deklarace identity. Transformace deklarací identity se provádějí podle pořadí definovaného v elementu OutputClaimsTransformations
. Například nejprve vytvoří zobrazovaný název a pak zprávu.
Přidejte následující
ClaimsProvider
položky jako podřízenouClaimsProviders
část.<ClaimsProvider> <DisplayName>Technical Profiles to generate claims</DisplayName> </ClaimsProvider>
Pokud chcete nastavit hodnoty pro objectId, displayName a deklarace identity zpráv, přidejte do právě vytvořeného elementu
ClaimsProvider
následující kód:<!--<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>-->
Shromažďování uživatelských vstupů
Vygenerujete deklaraci identity displayName z givenName a příjmení, takže je potřeba shromáždit poté jako vstupy uživatele. Chcete-li shromáždit uživatelský vstup, použijte typ technického profilu s názvem Self-Asserted. Když nakonfigurujete technický profil s vlastním kontrolním výrazem, musíte odkazovat na definice obsahu jako technický profil s vlastním kontrolním výrazem, který je zodpovědný za zobrazení uživatelského rozhraní.
Přidejte následující
ClaimsProvider
položky jako podřízenouClaimsProviders
část.<ClaimsProvider> <DisplayName>Technical Profiles to collect user's details </DisplayName> </ClaimsProvider>
Do právě vytvořeného elementu
ClaimsProvider
přidejte následující kód:<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>
Všimněte si dvou zobrazených deklarací pro dané jméno a příjmení . Obě deklarace identity jsou označené jako povinné, takže uživatel musí zadat hodnoty před odesláním formuláře, který se mu zobrazí. Deklarace identity se zobrazí na obrazovce v pořadí definovaném v prvku DisplayClaims , jako je například Given Name a pak Příjmení.
Krok 5 : Definování cest uživatelů
Cesty uživatelů slouží k definování pořadí, ve kterém se volají technické profily. Tento OrchestrationSteps
prvek slouží k určení kroků na cestě uživatele.
Nahraďte stávající obsah HelloWorldJourney
cesty uživatele následujícím kódem:
<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>
Podle kroků orchestrace shromažďujeme vstupy uživatelů, nastavíme hodnoty pro objectId, displayName a deklarace identity zpráv a nakonec odešleme token Jwt.
Krok 6 – aktualizace předávající strany
Obsah prvku oddílu OutputClaims
RelyingParty
nahraďte následujícím kódem:
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="displayName"/>
<OutputClaim ClaimTypeReferenceId="message"/>
Po dokončení kroku 6ContosoCustomPolicy.XML
by měl soubor vypadat podobně jako následující kód:
<?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>
Pokud jste to ještě neudělali, nahraďte yourtenant
část subdomény vašeho názvu tenanta, například contoso
. Zjistěte, jak získat název tenanta.
Krok 3 : Nahrání souboru vlastních zásad
Postupujte podle kroků v nahrání souboru vlastních zásad. Pokud nahráváte soubor se stejným názvem jako soubor, který už je na portálu, nezapomeňte vybrat Možnost Přepsat vlastní zásadu, pokud už existuje.
Krok 4 – Testování vlastních zásad
V části Vlastní zásady vyberte B2C_1A_CONTOSOCUSTOMPOLICY.
V části Vybrat aplikaci na stránce přehledu vlastních zásad vyberte webovou aplikaci, například webovou aplikaci1 , kterou jste předtím zaregistrovali. Ujistěte se, že je nastavená
https://jwt.ms
hodnota Vybrat adresu URL odpovědi.Vyberte tlačítko Spustit.
Zadejte zadané jméno a příjmení a pak vyberte Pokračovat.
Po dokončení provádění zásady budete přesměrováni na https://jwt.ms
a zobrazí se dekódovaný token JWT. Vypadá podobně jako následující fragment kódu tokenu JWT:
{
"typ": "JWT",
"alg": "RS256",
"kid": "pxLOMWFg...."
}.{
...
"sub": "c7ae4515-f7a7....",
...
"acr": "b2c_1a_contosocustompolicy",
...
"name": "Maurice Paulet",
"message": "Hello Maurice Paulet"
}.[Signature]
Další kroky
Dále se dozvíte:
O typech technických profilů ve vlastních zásadách Azure AD B2C