Skriv din första anpassade Azure Active Directory B2C-princip – Hello World!

I ditt program kan du använda användarflöden som gör det möjligt för användare att registrera sig, logga in eller hantera sin profil. När användarflöden inte täcker alla dina affärsspecifika behov kan du använda anpassade principer.

Du kan använda det färdiga startpaketet för anpassad princip för att skriva anpassade principer, men det är viktigt att du förstår hur en anpassad princip skapas. I den här artikeln får du lära dig hur du skapar din första anpassade princip från grunden.

Förutsättningar

Kommentar

Den här artikeln är en del av guideserien Skapa och köra egna anpassade principer i Azure Active Directory B2C. Vi rekommenderar att du startar den här serien från den första artikeln.

Steg 1 – Konfigurera signerings- och krypteringsnycklarna

Om du inte redan har gjort det skapar du följande krypteringsnycklar. Om du vill automatisera genomgången nedan går du till IEF-installationsappen och följer anvisningarna:

  1. Använd stegen i Lägg till signerings- och krypteringsnycklar för Identity Experience Framework-program för att skapa signeringsnyckeln.

  2. Använd stegen i Lägg till signerings- och krypteringsnycklar för Identity Experience Framework-program för att skapa krypteringsnyckeln.

Steg 2 – Skapa den anpassade principfilen

  1. I VS Code skapar och öppnar du filen ContosoCustomPolicy.XML.

  2. ContosoCustomPolicy.XML Lägg till följande kod i filen:

        <?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>
                <!-- Building Blocks Here-->
            </BuildingBlocks>
    
            <ClaimsProviders>
                <!-- Claims Providers Here-->
            </ClaimsProviders>
    
            <UserJourneys>
                <!-- User Journeys Here-->
            </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
                -->
            </RelyingParty>
        </TrustFrameworkPolicy>
    
    

    Ersätt yourtenant med underdomändelen av klientorganisationens namn, till exempel contoso. Lär dig hur du hämtar ditt klientnamn.

    XML-elementen definierar elementet på den översta nivån TrustFrameworkPolicy i en principfil med dess princip-ID och klientnamn. Elementet TrustFrameworkPolicy innehåller andra XML-element som du ska använda i den här serien.

  3. Om du vill deklarera ett anspråk lägger du till följande kod i BuildingBlocks avsnittet i ContosoCustomPolicy.XML filen:

      <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>
      </ClaimsSchema>
    

    Ett anspråk är som en variabel. Anspråkets deklaration visar också anspråkets datatyp.

  4. I avsnittet ClaimsProviders i ContosoCustomPolicy.XML filen lägger du till följande kod:

        <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>
          <!-- The technical profile(s) defined in this section is required by the framework to be included in all custom policies. -->
          <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>
    

    Vi har deklarerat en utfärdare av JWT-token. CryptographicKeys Om du i avsnittet använde olika namn för att konfigurera signerings- och krypteringsnycklarna i steg 1 kontrollerar du att du använder rätt värde för StorageReferenceId.

  5. I avsnittet UserJourneys i ContosoCustomPolicy.XML filen lägger du till följande kod:

      <UserJourney Id="HelloWorldJourney">
        <OrchestrationSteps>
          <OrchestrationStep Order="1" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
        </OrchestrationSteps>
      </UserJourney>
    

    Vi har lagt till en UserJourney. Användarresan anger affärslogik som slutanvändaren går igenom när Azure AD B2C bearbetar en begäran. Den här användarresan har bara ett steg som utfärdar en JTW-token med de anspråk som du definierar i nästa steg.

  6. I avsnittet RelyingParty i ContosoCustomPolicy.XML filen lägger du till följande kod:

      <DefaultUserJourney ReferenceId="HelloWorldJourney"/>
      <TechnicalProfile Id="HelloWorldPolicyProfile">
        <DisplayName>Hello World Policy Profile</DisplayName>
        <Protocol Name="OpenIdConnect" />
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" DefaultValue="abcd-1234-efgh-5678-ijkl-etc."/>
          <OutputClaim ClaimTypeReferenceId="message" DefaultValue="Hello World!"/>
        </OutputClaims>
        <SubjectNamingInfo ClaimType="sub" />
      </TechnicalProfile>
    

    Avsnittet RelyingParty är startpunkten för principen. Den anger vilken UserJourney som ska köras och anspråken som ska inkluderas i den token som returneras när principen körs.

När du har slutfört steg 2ContosoCustomPolicy.XML bör filen se ut ungefär som följande kod:

    <?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="Contosob2c2233.onmicrosoft.com" PolicyId="B2C_1A_ContosoCustomPolicy" PublicPolicyUri="http://Contosob2c2233.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>
            </ClaimsSchema>
        </BuildingBlocks>
        <ClaimsProviders><!--Claims Providers Here-->
            <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>
        </ClaimsProviders>
      <UserJourneys>
        <UserJourney Id="HelloWorldJourney">
          <OrchestrationSteps>
            <OrchestrationStep Order="1" 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" DefaultValue="abcd-1234-efgh-5678-ijkl-etc."/>
                    <OutputClaim ClaimTypeReferenceId="message" DefaultValue="Hello World!"/>
                </OutputClaims>
                <SubjectNamingInfo ClaimType="sub"/>
            </TechnicalProfile>
        </RelyingParty>
    </TrustFrameworkPolicy>

Steg 3 – Ladda upp anpassad principfil

  1. Logga in på Azure-portalen.
  2. Om du har åtkomst till flera klienter väljer du ikonen Inställningar på den översta menyn för att växla till din Azure AD B2C-klient från menyn Kataloger + prenumerationer.
  3. I Azure-portalen söker du efter och väljer Azure AD B2C.
  4. I den vänstra menyn, under Principer, väljer du Identity Experience Framework.
  5. Välj Överför anpassad princip, bläddra bland välj och ladda sedan upp ContosoCustomPolicy.XML filen.

När du har laddat upp filen lägger Azure AD B2C till prefixet B2C_1A_, så namnen ser ut ungefär som B2C_1A_CONTOSOCUSTOMPOLICY.

Steg 4 – Testa den anpassade principen

  1. Under Anpassade principer väljer du B2C_1A_CONTOSOCUSTOMPOLICY.
  2. 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.
  3. Välj knappen Kör nu .

När principen har slutfört körningen omdirigeras du till https://jwt.msoch du ser en avkodad JWT-token. Det ser ut ungefär som följande JWT-tokenfragment:

    {
      "typ": "JWT",
      "alg": "RS256",
      "kid": "pxLOMWFg...."
    }.{
      ...
      "sub": "abcd-1234-efgh-5678-ijkl-etc.",
      ...
      "acr": "b2c_1a_contosocustompolicy",
      ...
      "message": "Hello World!"
    }.[Signature]

Observera anspråken message och sub som vi anger som utdataanspråk i avsnittet RelyingParty .

Nästa steg

I den här artikeln har du lärt dig och använt fyra avsnitt som ingår i en anpassad Azure AD B2C-princip. De här avsnitten läggs till som underordnade element i TrustFrameworkPolicy rotelementet:

  • BuildingBlocks
  • ClaimsProviders
  • UserJourneys
  • RelyingParty

Lär dig sedan: