Partager via


Vérification personnalisée de l’e-mail avec Mailjet

Important

À compter du 1er mai 2025, Azure AD B2C ne sera plus disponible pour les nouveaux clients. Pour plus d’informations, consultez notre FAQ.

Avant de commencer, utilisez le sélecteur Choisir un type de stratégie en haut de cette page pour choisir le type de stratégie que vous configurez. Azure Active Directory B2C offre deux possibilités pour définir la façon dont les utilisateurs interagissent avec vos applications : via des flux utilisateurs prédéfinis ou via des stratégies personnalisées entièrement configurables. La procédure donnée dans cet article est différente pour chaque méthode.

Utilisez un e-mail personnalisé dans Azure Active Directory B2C (Azure AD B2C) pour envoyer un e-mail personnalisé aux utilisateurs qui s’inscrivent pour utiliser vos applications. À l’aide du fournisseur de messagerie tiers Mailjet, vous pouvez utiliser votre propre modèle de messagerie et À partir de : adresse et objet, ainsi que prendre en charge les paramètres de localisation et de mot de passe à usage unique (OTP).

Cette fonctionnalité est disponible uniquement pour les stratégies personnalisées. Pour les étapes de configuration, sélectionnez Stratégie personnalisée dans le sélecteur précédent.

La vérification de l’e-mail personnalisée nécessite l’utilisation d’un fournisseur de messagerie tiers tel que Mailjet, SendGrid ou SparkPost, une API REST personnalisée ou n’importe quel fournisseur de messagerie basé sur HTTP (y compris votre propre). Cet article décrit la configuration d’une solution qui utilise Mailjet.

Créer un compte Mailjet

Si vous n’en avez pas encore, commencez par configurer un compte Mailjet (les clients Azure peuvent déverrouiller 6 000 e-mails avec une limite de 200 e-mails/jour).

  1. Suivez les instructions de configuration à l’adresse Créer un compte Mailjet.
  2. Pour pouvoir envoyer des e-mails, inscrire et valider votre adresse e-mail ou votre domaine d’expéditeur.
  3. Accédez à la page Gestion des clés d’API. Enregistrez la clé API et la clé secrète à utiliser dans une étape ultérieure. Les deux clés sont générées automatiquement lorsque votre compte est créé.

Important

Mailjet offre aux clients la possibilité d’envoyer des e-mails à partir d’adresses IP partagées et d’adresses IP dédiées. Lorsque vous utilisez des adresses IP dédiées, vous devez établir une bonne réputation de manière appropriée grâce à un processus de préchauffage des adresses IP. Pour plus d’informations, consultez Comment faire pour réchauffer mon adresse IP ?.

Créer une clé de stratégie Azure AD B2C

Ensuite, stockez la clé API Mailjet dans une clé de politique Azure AD B2C pour permettre à vos stratégies de les référencer.

  1. Connectez-vous au portail Azure.
  2. Si vous avez accès à plusieurs tenants (locataires), sélectionnez l’icône Paramètres dans le menu supérieur pour basculer vers votre tenant Azure AD B2C à partir du menu Annuaires + abonnements.
  3. Choisissez tous les services dans le coin supérieur gauche du portail Azure, puis recherchez et sélectionnez Azure AD B2C.
  4. Dans la page Vue d’ensemble , sélectionnez Identity Experience Framework.
  5. Sélectionnez Clés de stratégie, puis sélectionnez Ajouter.
  6. Pour options, choisissez Manuel.
  7. Entrez un nom pour la clé de stratégie. Par exemple : MailjetApiKey. Le préfixe B2C_1A_ est ajouté automatiquement au nom de votre clé.
  8. Dans Secret, entrez votre clé API Mailjet que vous avez enregistrée précédemment.
  9. Pour l’utilisation de la clé, sélectionnez Signature.
  10. Cliquez sur Créer.
  11. Sélectionnez Clés de stratégie , puis sélectionnez Ajouter.
  12. Pour options, choisissez Manuel.
  13. Entrez un nom pour la clé de stratégie. Par exemple : MailjetSecretKey. Le préfixe B2C_1A_ est ajouté automatiquement au nom de votre clé.
  14. Dans Secret, entrez votre clé secrète Mailjet que vous avez enregistrée précédemment.
  15. Pour l’utilisation de la clé, sélectionnez Signature.
  16. Cliquez sur Créer.

Créer un modèle Mailjet

Avec un compte Mailjet créé et la clé API Mailjet stockée dans une clé de stratégie Azure AD B2C, créez un modèle transactionnel dynamique Mailjet.

  1. Sur le site Mailjet, ouvrez la page modèles transactionnels et sélectionnez Créer un modèle.

  2. Sélectionnez En le codeant en HTML, puis sélectionnez Code à partir de zéro.

  3. Entrez un nom de modèle unique, par exemple Verification email, puis sélectionnez Créer.

  4. Dans l’éditeur HTML, collez le modèle HTML suivant ou utilisez votre propre modèle. Les paramètres {{var:otp:""}} et {{var:email:""}} sont remplacés dynamiquement par la valeur du mot de passe unique et l’adresse e-mail de l’utilisateur.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en"><head id="Head1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Contoso demo account email verification code</title><meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
       <!-- Template B O365 -->
       <style>
           table td {border-collapse:collapse;margin:0;padding:0;}
       </style>
    </head>
    <body dir="ltr" lang="en">
       <table width="100%" cellpadding="0" cellspacing="0" border="0" dir="ltr" lang="en">
            <tr>
               <td valign="top" width="50%"></td>
               <td valign="top">
                  <!-- Email Header -->
                  <table width="640" cellpadding="0" cellspacing="0" border="0" dir="ltr" lang="en" style="border-left:1px solid #e3e3e3;border-right: 1px solid #e3e3e3;">
                   <tr style="background-color: #0072C6;">
                       <td width="1" style="background:#0072C6; border-top:1px solid #e3e3e3;"></td>
                       <td width="24" style="border-top:1px solid #e3e3e3;border-bottom:1px solid #e3e3e3;">&nbsp;</td>
                       <td width="310" valign="middle" style="border-top:1px solid #e3e3e3; border-bottom:1px solid #e3e3e3;padding:12px 0;">
                           <h1 style="line-height:20pt;font-family:Segoe UI Light; font-size:18pt; color:#ffffff; font-weight:normal;">
                            <span id="HeaderPlaceholder_UserVerificationEmailHeader"><font color="#FFFFFF">Verify your email address</font></span>
                           </h1>
                       </td>
                       <td width="24" style="border-top: 1px solid #e3e3e3;border-bottom: 1px solid #e3e3e3;">&nbsp;</td>
                   </tr>
                  </table>
                  <!-- Email Content -->
                  <table width="640" cellpadding="0" cellspacing="0" border="0" dir="ltr" lang="en">
                   <tr>
                       <td width="1" style="background:#e3e3e3;"></td>
                       <td width="24">&nbsp;</td>
                       <td id="PageBody" width="640" valign="top" colspan="2" style="border-bottom:1px solid #e3e3e3;padding:10px 0 20px;border-bottom-style:hidden;">
                           <table cellpadding="0" cellspacing="0" border="0">
                               <tr>
                                   <td width="630" style="font-size:10pt; line-height:13pt; color:#000;">
                                       <table cellpadding="0" cellspacing="0" border="0" width="100%" style="" dir="ltr" lang="en">
                                           <tr>
                                               <td>
    
       <div style="font-family:'Segoe UI', Tahoma, sans-serif; font-size:14px; color:#333;">
           <span id="BodyPlaceholder_UserVerificationEmailBodySentence1">Thanks for verifying your {{var:email:""}} account!</span>
       </div>
       <br>
       <div style="font-family:'Segoe UI', Tahoma, sans-serif; font-size:14px; color:#333; font-weight: bold">
           <span id="BodyPlaceholder_UserVerificationEmailBodySentence2">Your code is: {{var:otp:""}}</span>
       </div>
       <br>
       <br>
    
                                                   <div style="font-family:'Segoe UI', Tahoma, sans-serif; font-size:14px; color:#333;">
                                                   Sincerely,
                                                   </div>
                                                   <div style="font-family:'Segoe UI', Tahoma, sans-serif; font-size:14px; font-style:italic; color:#333;">
                                                       Contoso
                                                   </div>
                                               </td>
                                           </tr>
                                       </table>
                                   </td>
                               </tr>
                           </table>
    
                       </td>
    
                       <td width="1">&nbsp;</td>
                       <td width="1"></td>
                       <td width="1">&nbsp;</td>
                       <td width="1" valign="top"></td>
                       <td width="29">&nbsp;</td>
                       <td width="1" style="background:#e3e3e3;"></td>
                   </tr>
                   <tr>
                       <td width="1" style="background:#e3e3e3; border-bottom:1px solid #e3e3e3;"></td>
                       <td width="24" style="border-bottom:1px solid #e3e3e3;">&nbsp;</td>
                       <td id="PageFooterContainer" width="585" valign="top" colspan="6" style="border-bottom:1px solid #e3e3e3;padding:0px;">
    
                       </td>
    
                       <td width="29" style="border-bottom:1px solid #e3e3e3;">&nbsp;</td>
                       <td width="1" style="background:#e3e3e3; border-bottom:1px solid #e3e3e3;"></td>
                   </tr>
                  </table>
    
               </td>
               <td valign="top" width="50%"></td>
           </tr>
       </table>
    </body>
    </html>
    
  5. Déployer Modifier le sujet en haut à gauche

    1. Pour Subject, entrez une valeur par défaut pour l’objet. Mailjet utilise cette valeur lorsque l’API ne contient pas de paramètre d’objet.
    2. Pour le nom, tapez le nom de votre société.
    3. Pour l’adresse, sélectionnez votre adresse e-mail
    4. Cliquez sur Enregistrer.
  6. Dans la partie supérieure droite, sélectionnez Enregistrer & Publier, puis Oui, publiez les modifications

  7. Enregistrez l’ID de modèle du modèle que vous avez créé pour une utilisation dans une étape ultérieure. Vous spécifiez cet ID lorsque vous ajoutez la transformation de réclamations.

Important

Les étapes suivantes vous montrent comment créer vos fichiers XML de stratégie personnalisée. Nous vous recommandons d’utiliser un exemple de stratégie personnalisée de vérification de messagerie personnalisée disponible sur GitHub. DisplayControl_TrustFrameworkExtensions.xml utilise TrustFrameworkExtensions.xml comme fichier de base, veillez donc à inclure les fichiers TrustFrameworkBase.xml, TrustFrameworkLocalization.xml et TrustFrameworkExtensions.xml depuis le SocialAndLocalAccountsstarter pack dans votre stratégie.

Ajouter des types de revendications Azure AD B2C

Dans votre stratégie, ajoutez les types de revendications suivants à l’élément <ClaimsSchema> dans <BuildingBlocks>.

Ces types de revendications sont nécessaires pour générer et vérifier l’adresse e-mail à l’aide d’un code de mot de passe unique (OTP).

<!--
<BuildingBlocks>
  <ClaimsSchema> -->
    <ClaimType Id="Otp">
      <DisplayName>Secondary One-time password</DisplayName>
      <DataType>string</DataType>
    </ClaimType>
    <ClaimType Id="emailRequestBody">
      <DisplayName>Mailjet request body</DisplayName>
      <DataType>string</DataType>
    </ClaimType>
    <ClaimType Id="VerificationCode">
      <DisplayName>Secondary Verification Code</DisplayName>
      <DataType>string</DataType>
      <UserHelpText>Enter your email verification code</UserHelpText>
      <UserInputType>TextBox</UserInputType>
    </ClaimType>
  <!-- 
  </ClaimsSchema>
</BuildingBlocks> -->

Ajouter la transformation de revendications

Ensuite, vous avez besoin d'une transformation de revendications pour générer une revendication de chaîne JSON qui constitue le corps de la requête envoyée à Mailjet.

La structure de l'objet JSON est définie par les ID en notation par points des éléments InputParameters et des éléments TransformationClaimTypes de InputClaims. Les nombres dans la notation par points impliquent des tableaux. Les valeurs proviennent des valeurs InputClaims et des propriétés « Value » des éléments InputParameters. Pour plus d’informations sur les transformations de revendications JSON, consultez transformations de revendications JSON.

Ajoutez la transformation des revendications suivante à l'élément <ClaimsTransformations> dans <BuildingBlocks>. Effectuez les mises à jour suivantes dans le fichier de transformation de réclamations XML :

  • Mettez à jour la Messages.0.TemplateID valeur InputParameter avec l’ID du modèle transactionnel Mailjet que vous avez créé précédemment dans Créer un modèle Mailjet.
  • Mettez à jour la valeur d’adresse Messages.0.From.Email . Utilisez une adresse e-mail valide pour empêcher l’e-mail de vérification d’être marqué comme courrier indésirable.
  • Mettez à jour la valeur du Messages.0.Subject paramètre d’entrée de ligne d’objet avec une ligne d’objet appropriée pour votre organisation.
<!-- 
<BuildingBlocks>
  <ClaimsTransformations> -->
    <ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.To.0.Email" />
        <InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="Messages.0.Variables.otp" />
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.Variables.email" />
      </InputClaims>
      <InputParameters>
        <!-- Update the template_id value with the ID of your Mailjet template. -->
        <InputParameter Id="Messages.0.TemplateID" DataType="int" Value="1234567"/>
        <InputParameter Id="Messages.0.TemplateLanguage" DataType="boolean" Value="true"/>

        <!-- Update with an email appropriate for your organization. -->
        <InputParameter Id="Messages.0.From.Email" DataType="string" Value="my_email@mydomain.com"/>

        <!-- Update with a subject line appropriate for your organization. -->
        <InputParameter Id="Messages.0.Subject" DataType="string" Value="Contoso account email verification code"/>
      </InputParameters>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim"/>
      </OutputClaims>
    </ClaimsTransformation>
  <!--
  </ClaimsTransformations>
</BuildingBlocks> -->

Ajouter une définition de contenu DataUri

Sous les transformations de revendications dans <BuildingBlocks>, ajoutez l’élément ContentDefinition suivant pour faire référence à l’URI de données de la version 2.1.2 :

<!--
<BuildingBlocks> -->
  <ContentDefinitions>
   <ContentDefinition Id="api.localaccountsignup">
      <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.2</DataUri>
    </ContentDefinition>
    <ContentDefinition Id="api.localaccountpasswordreset">
      <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.2</DataUri>
    </ContentDefinition>
  </ContentDefinitions>
<!--
</BuildingBlocks> -->

Créer un DisplayControl

Un contrôle d’affichage de vérification est utilisé pour vérifier l’adresse e-mail à l’aide d’un code de vérification envoyé à l’utilisateur.

Cet exemple de contrôle d’affichage est configuré pour :

  1. Recueillir le type de revendication d'adresse email auprès de l'utilisateur.

  2. À l’aide de l’action SendCode , générez un code OTP et envoyez un e-mail avec le code OTP à l’utilisateur.

    Action d'envoi d'email de code de vérification

  3. Attendez que l’utilisateur fournisse le type de demande verificationCode avec le code qui a été envoyé à l’utilisateur.

  4. Retourner email au profil technique autodéclaré qui contient une référence à ce contrôle d’affichage.

Sous les définitions de contenu, toujours dans <BuildingBlocks>, ajoutez le DisplayControl suivant de type VerificationControl à votre politique.

<!--
<BuildingBlocks> -->
  <DisplayControls>
    <DisplayControl Id="emailVerificationControl" UserInterfaceControlType="VerificationControl">
      <DisplayClaims>
        <DisplayClaim ClaimTypeReferenceId="email" Required="true" />
        <DisplayClaim ClaimTypeReferenceId="verificationCode" ControlClaimType="VerificationCode" Required="true" />
      </DisplayClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="email" />
      </OutputClaims>
      <Actions>
        <Action Id="SendCode">
          <ValidationClaimsExchange>
            <ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="GenerateOtp" />
            <ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="SendOtp" />
          </ValidationClaimsExchange>
        </Action>
        <Action Id="VerifyCode">
          <ValidationClaimsExchange>
            <ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="VerifyOtp" />
          </ValidationClaimsExchange>
        </Action>
      </Actions>
    </DisplayControl>
  </DisplayControls>
<!--
</BuildingBlocks> -->

Ajouter des profils techniques OTP

Le GenerateOtp profil technique génère un code pour l’adresse e-mail. Le VerifyOtp profil technique vérifie le code associé à l’adresse e-mail. Vous pouvez modifier la configuration du format et l’expiration du mot de passe à usage unique. Pour plus d’informations sur les profils techniques otP, consultez Définir un profil technique de mot de passe unique.

Remarque

Les codes OTP générés par le protocole Web.TPEngine.Providers.OneTimePasswordProtocolProvider sont liés à la session du navigateur. Cela signifie qu’un utilisateur peut générer des codes OTP uniques dans différentes sessions de navigateur valides pour leurs sessions correspondantes. En revanche, un code OTP généré par le fournisseur de messagerie intégré est indépendant de la session du navigateur. Par conséquent, si un utilisateur génère un nouveau code OTP dans une nouvelle session de navigateur, il remplace le code OTP précédent.

Ajoutez les profils techniques suivants à l’élément <ClaimsProviders> .

<!--
<ClaimsProviders> -->
  <ClaimsProvider>
    <DisplayName>One time password technical profiles</DisplayName>
    <TechnicalProfiles>
      <TechnicalProfile Id="GenerateOtp">
        <DisplayName>Generate one time password</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.OneTimePasswordProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
          <Item Key="Operation">GenerateCode</Item>
          <Item Key="CodeExpirationInSeconds">600</Item>
          <Item Key="CodeLength">6</Item>
          <Item Key="CharacterSet">0-9</Item>
          <Item Key="NumRetryAttempts">5</Item>
          <Item Key="NumCodeGenerationAttempts">10</Item>
          <Item Key="ReuseSameCode">false</Item>
        </Metadata>
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="identifier" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="otp" PartnerClaimType="otpGenerated" />
        </OutputClaims>
      </TechnicalProfile>

      <TechnicalProfile Id="VerifyOtp">
        <DisplayName>Verify one time password</DisplayName>
        <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.OneTimePasswordProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
          <Item Key="Operation">VerifyCode</Item>
        </Metadata>
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="identifier" />
          <InputClaim ClaimTypeReferenceId="verificationCode" PartnerClaimType="otpToVerify" />
        </InputClaims>
      </TechnicalProfile>
     </TechnicalProfiles>
  </ClaimsProvider>
<!--
</ClaimsProviders> -->

Ajouter un profil technique d’API REST

Ce profil technique de l’API REST génère le contenu de l’e-mail (au format Mailjet). Pour plus d’informations sur les profils techniques RESTful, consultez Définir un profil technique RESTful.

Comme pour les profils techniques OTP, ajoutez les profils techniques suivants à l’élément <ClaimsProviders> .

<ClaimsProvider>
  <DisplayName>RestfulProvider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="sendOtp">
      <DisplayName>Use email API to send the code to the user</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">https://api.mailjet.com/v3.1/send</Item>
        <Item Key="AuthenticationType">Basic</Item>
        <Item Key="SendClaimsIn">Body</Item>
        <Item Key="ClaimUsedForRequestPayload">emailRequestBody</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="BasicAuthenticationUsername" StorageReferenceId="B2C_1A_MailjetApiKey" />
        <Key Id="BasicAuthenticationPassword" StorageReferenceId="B2C_1A_MailjetSecretKey" />
      </CryptographicKeys>
      <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="GenerateEmailRequestBody" />
      </InputClaimsTransformations>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="emailRequestBody" />
      </InputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Faire référence à DisplayControl

À l’étape finale, ajoutez une référence à DisplayControl que vous avez créée. Remplacez vos profils techniques existants LocalAccountSignUpWithLogonEmail et LocalAccountDiscoveryUsingEmailAddress autodéclarés qui sont configurés dans la stratégie de base avec l’extrait de code XML suivant. Si vous avez utilisé une version antérieure de la stratégie Azure AD B2C, ces profils techniques s’utilisent DisplayClaims avec une référence au DisplayControl.

Pour plus d’informations, consultez profil technique autodéclaré et DisplayControl.

<ClaimsProvider>
  <DisplayName>Local Account</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
      <DisplayClaims>
        <DisplayClaim DisplayControlReferenceId="emailVerificationControl" />
        <DisplayClaim ClaimTypeReferenceId="displayName" Required="true" />
        <DisplayClaim ClaimTypeReferenceId="givenName" Required="true" />
        <DisplayClaim ClaimTypeReferenceId="surName" Required="true" />
        <DisplayClaim ClaimTypeReferenceId="newPassword" Required="true" />
        <DisplayClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
      </DisplayClaims>
    </TechnicalProfile>
    <TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
      <DisplayClaims>
        <DisplayClaim DisplayControlReferenceId="emailVerificationControl" />
      </DisplayClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

[Facultatif] Localiser votre e-mail

Pour localiser l’e-mail, vous devez envoyer des chaînes localisées à Mailjet ou à votre fournisseur de messagerie. Par exemple, vous pouvez localiser l’objet de l’e-mail, le corps, le message de code ou la signature de l’e-mail. Pour ce faire, vous pouvez utiliser la transformation de réclamations GetLocalizedStringsTransformation pour copier des chaînes localisées dans des catégories de réclamations. La transformation de revendications GenerateEmailRequestBody, qui génère la charge utile JSON, utilise des revendications d’entrée qui contiennent les chaînes localisées.

  1. Dans votre stratégie, définissez les revendications de chaîne suivantes : objet, message, codeIntro et signature.

  2. Définissez une transformation de revendications GetLocalizedStringsTransformation pour remplacer les valeurs de chaîne localisées dans les revendications de l’étape 1.

  3. Modifiez la transformation des déclarations GenerateEmailRequestBody pour utiliser les déclarations d’entrée avec l’extrait de code XML suivant.

  4. Mettez à jour votre modèle Mailjet pour utiliser des paramètres dynamiques à la place de toutes les chaînes qui seront localisées par Azure AD B2C.

    <ClaimsTransformation Id="GetLocalizedStringsForEmail" TransformationMethod="GetLocalizedStringsTransformation">
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="subject" TransformationClaimType="email_subject" />
        <OutputClaim ClaimTypeReferenceId="message" TransformationClaimType="email_message" />
        <OutputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="email_code" />
        <OutputClaim ClaimTypeReferenceId="signature" TransformationClaimType="email_signature" />
      </OutputClaims>
    </ClaimsTransformation>
    <ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.To.0.Email" />
        <InputClaim ClaimTypeReferenceId="subject" TransformationClaimType="Messages.0.Subject" />
        <InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="Messages.0.Variables.otp" />
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.Variables.email" />
        <InputClaim ClaimTypeReferenceId="message" TransformationClaimType="Messages.0.Variables.otpmessage" />
        <InputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="Messages.0.Variables.otpcodeIntro" />
        <InputClaim ClaimTypeReferenceId="signature" TransformationClaimType="Messages.0.Variables.otpsignature" />
      </InputClaims>
      <InputParameters>
        <!-- Update the template_id value with the ID of your Mailjet template. -->
        <InputParameter Id="Messages.0.TemplateID" DataType="int" Value="1234567"/>
        <InputParameter Id="Messages.0.TemplateLanguage" DataType="boolean" Value="true"/>
    
        <!-- Update with an email appropriate for your organization. -->
        <InputParameter Id="Messages.0.From.Email" DataType="string" Value="my_email@mydomain.com"/>
      </InputParameters>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim"/>
      </OutputClaims>
    </ClaimsTransformation>
    
  5. Ajoutez l’élément Localisation suivant.

    <!--
    <BuildingBlocks> -->
      <Localization Enabled="true">
        <SupportedLanguages DefaultLanguage="en" MergeBehavior="ReplaceAll">
          <SupportedLanguage>en</SupportedLanguage>
          <SupportedLanguage>es</SupportedLanguage>
        </SupportedLanguages>
        <LocalizedResources Id="api.custom-email.en">
          <LocalizedStrings>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_subject">Contoso account email verification code</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_message">Thanks for validating the account</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_code">Your code is</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_signature">Sincerely</LocalizedString>
          </LocalizedStrings>
        </LocalizedResources>
        <LocalizedResources Id="api.custom-email.es">
          <LocalizedStrings>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_subject">Código de verificación del correo electrónico de la cuenta de Contoso</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_message">Gracias por comprobar la cuenta de </LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_code">Su código es</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_signature">Sinceramente</LocalizedString>
          </LocalizedStrings>
        </LocalizedResources>
      </Localization>
    <!--
    </BuildingBlocks> -->
    
  6. Ajoutez des références aux éléments LocalizedResources en mettant à jour l’élément ContentDefinitions .

    <!--
    <BuildingBlocks> -->
      <ContentDefinitions>
        <ContentDefinition Id="api.localaccountsignup">
          <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.2</DataUri>
          <LocalizedResourcesReferences MergeBehavior="Prepend">
            <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.custom-email.en" />
            <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.custom-email.es" />
          </LocalizedResourcesReferences>
        </ContentDefinition>
        <ContentDefinition Id="api.localaccountpasswordreset">
          <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.2</DataUri>
          <LocalizedResourcesReferences MergeBehavior="Prepend">
            <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.custom-email.en" />
            <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.custom-email.es" />
          </LocalizedResourcesReferences>
        </ContentDefinition>
      </ContentDefinitions>
    <!--
    </BuildingBlocks> -->
    
  7. Enfin, ajoutez la transformation de revendications d’entrée suivante aux profils techniques LocalAccountSignUpWithLogonEmail et LocalAccountDiscoveryUsingEmailAddress.

    <InputClaimsTransformations>
      <InputClaimsTransformation ReferenceId="GetLocalizedStringsForEmail" />
    </InputClaimsTransformations>
    

[Facultatif] Localiser l’interface utilisateur

L’élément Localisation vous permet de prendre en charge plusieurs paramètres régionaux ou langues dans la stratégie pour les parcours utilisateur. La prise en charge de la localisation dans les stratégies vous permet de fournir des chaînes spécifiques à la langue à la fois pour les Éléments de l’interface utilisateur du contrôle de l’affichage de vérification et les Messages d’erreur du mot de passe à usage unique. Ajoutez la propriété LocalizedString suivante à vos LocalizedResources.

<LocalizedResources Id="api.custom-email.en">
  <LocalizedStrings>
    ...
    <!-- Display control UI elements-->
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="intro_msg">Verification is necessary. Please click Send button.</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="success_send_code_msg">Verification code has been sent to your inbox. Please copy it to the input box below.</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="failure_send_code_msg">We are having trouble verifying your email address. Please enter a valid email address and try again.</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="success_verify_code_msg">E-mail address verified. You can now continue.</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="failure_verify_code_msg">We are having trouble verifying your email address. Please try again.</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="but_send_code">Send verification code</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="but_verify_code">Verify code</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="but_send_new_code">Send new code</LocalizedString>
    <LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="but_change_claims">Change e-mail</LocalizedString>
    <!-- Claims-->
    <LocalizedString ElementType="ClaimType" ElementId="emailVerificationCode" StringId="DisplayName">Verification Code</LocalizedString>
    <LocalizedString ElementType="ClaimType" ElementId="emailVerificationCode" StringId="UserHelpText">Verification code received in the email.</LocalizedString>
    <LocalizedString ElementType="ClaimType" ElementId="emailVerificationCode" StringId="AdminHelpText">Verification code received in the email.</LocalizedString>
    <LocalizedString ElementType="ClaimType" ElementId="email" StringId="DisplayName">Email</LocalizedString>
    <!-- Email validation error messages-->
    <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfSessionDoesNotExist">You have exceeded the maximum time allowed.</LocalizedString>
    <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfMaxRetryAttempted">You have exceeded the number of retries allowed.</LocalizedString>
    <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfMaxNumberOfCodeGenerated">You have exceeded the number of code generation attempts allowed.</LocalizedString>
    <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfInvalidCode">You have entered the wrong code.</LocalizedString>
    <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfSessionConflict">Cannot verify the code, please try again later.</LocalizedString>
    <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfVerificationFailedRetryAllowed">The verification has failed, please try again.</LocalizedString>
  </LocalizedStrings>
</LocalizedResources>