Écrire votre première stratégie Azure Active Directory B2C personnalisée - Hello World!

Dans votre application, vous pouvez utiliser des flux utilisateur qui permettent aux utilisateurs de s’inscrire, de se connecter ou de gérer leur profil. Quand les flux utilisateur ne couvrent pas tous vos besoins métier spécifiques, vous pouvez utiliser des stratégies personnalisées.

Bien que vous puissiez utiliser le pack de démarrage de stratégie personnalisée prédéfini, il est important que vous compreniez comment créer une stratégie personnalisée. Cet article vous permet de découvrir comment créer entièrement votre première stratégie personnalisée.

Prérequis

Notes

Cet article fait partie de la série de guides pratiques Créer et exécuter vos propres stratégies personnalisées dans Azure Active Directory B2C. Nous vous recommandons de commencer cette série par le premier article.

Étape 1 : Configurer les clés de signature et de chiffrement

Si ce n’est déjà fait, créez les clés de chiffrement suivantes. Pour automatiser la procédure pas à pas ci-dessous, accédez à Application d’installation IEF et suivez les instructions :

  1. Effectuez les étapes décrites dans Ajouter des clés de signature et de chiffrement pour les applications Identity Experience Framework pour créer la clé de signature.

  2. Effectuez les étapes décrites dans Ajouter des clés de signature et de chiffrement pour les applications Identity Experience Framework pour créer la clé de chiffrement.

Étape 2 : Créer le fichier de stratégie personnalisée

  1. Dans VS Code, créez et ouvrez le fichier ContosoCustomPolicy.XML.

  2. Dans le fichier ContosoCustomPolicy.XML, ajoutez le code suivant :

        <?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>
    
    

    Remplacez yourtenant par la partie sous-domaine du nom de votre locataire, par exemple contoso. Découvrez comment Récupérer votre nom de locataire.

    Les éléments XML définissent l’élément TrustFrameworkPolicy de niveau supérieur d’un fichier de stratégie avec son ID de stratégie et son nom de locataire. L’élément TrustFrameworkPolicy contient d’autres éléments XML que vous allez utiliser dans cette série.

  3. Pour déclarer une revendication, ajoutez le code suivant dans la section BuildingBlocks du fichier ContosoCustomPolicy.XML :

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

    Une revendication est semblable à une variable. La déclaration de la revendication indique également le type de données de la revendication.

  4. Dans la section ClaimsProviders du fichier ContosoCustomPolicy.XML, ajoutez le code suivant :

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

    Nous avons déclaré un émetteur de jeton JWT. Dans la section CryptographicKeys, si vous avez utilisé des noms différents pour configurer les clés de signature et de chiffrement à l’étape 1, veillez à utiliser la valeur correcte pour StorageReferenceId.

  5. Dans la section UserJourneys du fichier ContosoCustomPolicy.XML, ajoutez le code suivant :

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

    Nous avons ajouté un élément UserJourney. Le parcours utilisateur spécifie la logique métier par laquelle passe l’utilisateur final quand Azure AD B2C traite une requête. Ce parcours utilisateur n’a qu’une seule étape, qui consiste à émettre un jeton JTW avec les revendications que vous définirez à l’étape suivante.

  6. Dans la section RelyingParty du fichier ContosoCustomPolicy.XML, ajoutez le code suivant :

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

    La section RelyingParty est le point d’entrée de votre stratégie. Elle spécifie l’élément UserJourney à exécuter et les revendications à inclure dans le jeton retourné quand la stratégie est exécutée.

À l’issue de l’étape 2, le fichier ContosoCustomPolicy.XML doit ressembler au code suivant :

    <?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>

Étape 3 : charger un fichier de stratégie personnalisée

  1. Connectez-vous au portail Azure.
  2. Si vous avez accès à plusieurs locataires, sélectionnez l’icône Paramètres dans le menu supérieur pour basculer vers votre locataire Azure AD B2C à partir du menu Annuaires + abonnements.
  3. Dans le portail Azure, recherchez et sélectionnez Azure AD B2C.
  4. Dans le menu de gauche, sous Stratégies, sélectionnez Identity Experience Framework.
  5. Sélectionnez Charger une stratégie personnalisée, puis sélectionnez et chargez le fichier ContosoCustomPolicy.XML.

Quand vous avez chargé le fichier, Azure AD B2C ajoute le préfixe B2C_1A_. Les noms se présentent donc ainsi : B2C_1A_CONTOSOCUSTOMPOLICY.

Étape 4 : Tester la stratégie personnalisée

  1. Sous les Stratégies personnalisées, sélectionnez B2C_1A_CONTOSOCUSTOMPOLICY.
  2. Pour l’élément Sélectionner une application dans la page de vue d’ensemble de la stratégie personnalisée, sélectionnez l’application web telle que webapp1 que vous avez précédemment inscrite. Vérifiez que l’élément Sélectionner l’URL de réponse est défini sur https://jwt.ms.
  3. Sélectionnez le bouton Exécuter maintenant.

Une fois l’exécution de la stratégie terminée, vous êtes redirigé vers https://jwt.ms et le jeton JWT décodé s’affiche. Il ressemble à l’extrait de jeton JWT suivant :

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

Notez les revendications message et sub que nous avons définies comme revendications de sortie dans la section RelyingParty.

Étapes suivantes

Cet article vous a permis de découvrir et d’utiliser quatre sections incluses dans une stratégie Azure AD B2C personnalisée. Ces sections sont ajoutées comme éléments enfants de l’élément racine TrustFrameworkPolicy :

  • BuildingBlocks
  • ClaimsProviders
  • UserJourneys
  • RelyingParty

Découvrez ensuite :