Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Viktigt!
Från och med den 1 maj 2025 är Azure AD B2C inte längre tillgängligt att köpa för nya kunder. Läs mer i våra vanliga frågor och svar.
Med anpassade principer för Azure Active Directory B2C (Azure AD B2C) kan du samla in användarindata. Du kan sedan använda inbyggda metoder för att hantera användarindata.
I den här artikeln får du lära dig hur du skriver en anpassad princip som samlar in användarindata via ett grafiskt användargränssnitt. Du får sedan åtkomst till indata, bearbetar sedan och returnerar dem slutligen som anspråk i en JWT. För att slutföra den här uppgiften gör du följande:
Deklarera anspråk. Ett tillstånd ger tillfällig lagring av data under en Azure AD B2C-policykörning. Den kan lagra information om användaren, till exempel förnamn, efternamn eller andra anspråk som hämtats från användaren eller andra system. Du kan lära dig mer om anspråk i översikten för anpassade principer i Azure AD B2C.
Definiera tekniska profiler. En teknisk profil tillhandahåller ett gränssnitt för att kommunicera med olika typer av parter. Du kan till exempel interagera med användaren för att samla in data.
Konfigurera anspråksomvandlingar som du använder för att manipulera de anspråk som du deklarerar.
Konfigurera innehållsdefinitioner. En innehållsdefinition definierar användargränssnittet som ska läsas in. Senare kan du anpassa användargränssnittet genom att tillhandahålla ditt eget anpassade HTML-innehåll.
Konfigurera och visa användargränssnitt för användaren med hjälp av Self-Asserted tekniska profiler och DisplayClaims.
Anropa tekniska profiler i en viss sekvens med hjälp av orkestreringssteg.
Förutsättningar
Om du inte redan har en, skapa en Azure AD B2C-klientenhet som är länkad till din Azure-prenumeration.
Du måste ha Visual Studio Code (VS Code) installerat på datorn.
Slutför stegen i Skriv din första anpassade Azure AD B2C-princip – Hello World!. Den här artikeln är en del av Skapa och köra egna anpassade policyguide.
Anmärkning
Den här artikeln är en del av Skapa och köra egna anpassade principer i Azure Active Directory B2C guideserie. Vi rekommenderar att du startar den här serien från den första artikeln.
Steg 1 – Deklarera anspråk
Deklarera ytterligare anspråk tillsammans med objectId och meddelande:
I VS Code, öppna
ContosoCustomPolicy.XML-filen.I avsnittet
ClaimsSchemalägger du till följande ClaimType-deklarationer :<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>
Vi har deklarerat tre anspråkstyper, givenName, efternamn och displayName. Dessa deklarationer omfattar DataType, UserInputType och DisplayName element:
- DataType anger datatypen för det värde som anspråken innehåller. Läs mer om de datatyper som DataType-elementen stöder.
- UserInputType anger den användargränssnittskontroll som visas i användargränssnittet om du vill samla in värdet för anspråket från användaren. Läs mer om de användarindatatyper som Azure AD B2C stöder.
- DisplayName anger etiketten för användargränssnittskontrollen som visas i användargränssnittet om du vill samla in värdet för anspråket från användaren.
Steg 2 – Definiera anspråkstransformeringar
En ClaimsTransformation innehåller en funktion som du använder för att konvertera ett visst anspråk till ett annat. Du kan till exempel ändra ett stränganspråk från gemener till versaler. Läs mer om anspråkstransformeringar som stöds av Azure AD B2C.
** I filen
ContosoCustomPolicy.XMLlägger du till ett<ClaimsTransformations>-element som ett underordnat tillBuildingBlocks-avsnittet.<ClaimsTransformations> </ClaimsTransformations>Lägg till följande kod i elementet
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>Vi har konfigurerat tre anspråkstransformeringar:
GenerateRandomObjectIdTransformation genererar en slumpmässig sträng enligt metoden CreateRandomString . ObjectId-anspråket uppdateras med den genererade strängen som anges av elementet
OutputClaim.CreateDisplayNameTransformation sammanfogar givenName och efternamn för att bilda displayName.
CreateMessageTransformation sammanfogar Hello och displayName för att skapa ett meddelande.
Steg 3 – Konfigurera innehållsdefinitioner
Med ContentDefinitions kan du ange URL till HTML-mallar som styr layouten för de webbsidor som du visar för användarna. Du kan ange specifika användargränssnitt för varje steg, till exempel inloggning eller registrering, lösenordsåterställning eller felsidor.
Om du vill lägga till innehållsdefinition lägger du till följande kod i BuildingBlocks avsnittet i ContosoCustomPolicy.XML filen:
<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>
Steg 4 – Konfigurera tekniska profiler
I en anpassad princip är en TechnicalProfile det element som implementerar funktioner. Nu när du har definierat anspråk och transformeringar av anspråk behöver du tekniska profiler för att genomföra dina definitioner. En teknisk profil deklareras i elementen ClaimsProvider .
Azure AD B2C tillhandahåller en uppsättning tekniska profiler. Varje teknisk profil utför en specifik roll. Du kan till exempel använda en teknisk REST-profil för att göra ett HTTP-anrop till en tjänstslutpunkt. Du kan använda en teknisk profil för anspråkstransformering för att köra den åtgärd som du definierar i en anspråkstransformering. Läs mer om de typer av tekniska profiler som azure AD B2C-anpassade principer tillhandahåller.
Ange värden för dina anspråk
Om du vill ange värden för objectId, displayName och meddelandeanspråk konfigurerar du en teknisk profil som kör anspråksomvandlingarna GenerateRandomObjectIdTransformation, CreateDisplayNameTransformation och CreateMessageTransformation . Anspråkstransformeringar körs i den ordning som definieras i elementet OutputClaimsTransformations. Den skapar till exempel först visningsnamnet och sedan meddelandet.
Lägg till följande
ClaimsProvidersom ett underordnat element tillClaimsProviders-delen.<ClaimsProvider> <DisplayName>Technical Profiles to generate claims</DisplayName> </ClaimsProvider>Om du vill ange värden för objectId, displayName och meddelandeanspråk lägger du till följande kod i elementet
ClaimsProvidersom du nyss skapade:<!--<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>-->
Samla in användarindata
Du genererar displayName-anspråket från givenName och surname, så du måste samla in dem som användarindata. Om du vill samla in en användarindata använder du en typ av teknisk profil med namnet Self-Asserted. När du konfigurerar en självsäkrad teknisk profil måste du referera till innehållsdefinitionerna, då denna profil ansvarar för att visa ett användargränssnitt.
Lägg till följande
ClaimsProvidersom ett underordnat element tillClaimsProviders-delen.<ClaimsProvider> <DisplayName>Technical Profiles to collect user's details </DisplayName> </ClaimsProvider>Lägg till följande kod i elementet
ClaimsProvidersom du nyss skapade:<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>Observera de två visningsanspråken för angivetNamn och efternamnsanspråk . Båda anspråken markeras som obligatoriska, så användaren måste ange värdena innan de skickar formuläret som visas för dem. Anspråken visas på skärmen i den ordning som definieras i elementet DisplayClaims , till exempel förnamn och sedan efternamn.
Steg 5 – Definiera användarresor
Du använder användarresor för att definiera i vilken ordning de tekniska profilerna anropas. Du använder elementet OrchestrationSteps för att ange stegen i en användarresa.
Ersätt det befintliga innehållet i HelloWorldJourney användarresan med följande kod:
<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>
Enligt orkestreringsstegen samlar vi in användarindata, anger värden för objectId, displayName och meddelandeanspråk och skickar slutligen JWT.
Steg 6 – Uppdatera förlitande part
Ersätt innehållet i elementet OutputClaims i RelyingParty avsnittet med följande kod:
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="displayName"/>
<OutputClaim ClaimTypeReferenceId="message"/>
När du har slutfört steg 6ContosoCustomPolicy.XML bör filen se ut ungefär så här:
<?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>
Om du inte redan har gjort det, ersätt yourtenant med underdomändelen av din klientorganisations namn, som contoso. Lär dig hur du hämtar ditt klientnamn.
Steg 7 – Ladda upp en anpassad principfil
Följ stegen i Ladda upp anpassad principfil. Om du laddar upp en fil med samma namn som den som redan finns i portalen kontrollerar du att du väljer Skriva över den anpassade principen om den redan finns.
Steg 8 – Testa den anpassade policyn
Under Anpassade principer väljer du B2C_1A_CONTOSOCUSTOMPOLICY.
För Välj program på översiktssidan för den anpassade principen väljer du webbprogrammet, till exempel webapp1 som du tidigare registrerade. Kontrollera att värdet Välj svars-URL är inställt på
https://jwt.ms.Välj knappen Kör nu .
Ange Förnamn och Efternamn och välj sedan Fortsätt.
När policyn har slutfört körningen omdirigeras du till https://jwt.ms och du ser en avkodad JWT. Det ser ut ungefär som följande JWT-kodfragment:
{
"typ": "JWT",
"alg": "RS256",
"kid": "pxLOMWFg...."
}.{
...
"sub": "c7ae4515-f7a7....",
...
"acr": "b2c_1a_contosocustompolicy",
...
"name": "Maurice Paulet",
"message": "Hello Maurice Paulet"
}.[Signature]
Relaterat innehåll
Lär dig sedan:
Om typerna av tekniska profiler i Azure AD B2C:s anpassade principer.
Så här verifierar du användarindata med hjälp av en anpassad princip.