Delen via


Aangepaste e-mailverificatie met SendGrid

Belangrijk

Vanaf 1 mei 2025 is Azure AD B2C niet meer beschikbaar voor nieuwe klanten. Meer informatie vindt u in onze veelgestelde vragen.

Voordat u begint, gebruikt u de selector Een beleidstype kiezen boven aan deze pagina om het type beleid te kiezen dat u instelt. U kunt in Azure Active Directory B2C op twee manieren definiëren hoe gebruikers met uw toepassingen communiceren: via vooraf gedefinieerde gebruikersstromen of via volledig configureerbaar aangepast beleid. De stappen die in dit artikel zijn vereist, verschillen voor elke methode.

Gebruik aangepaste e-mail in Azure Active Directory B2C (Azure AD B2C) om aangepaste e-mail te verzenden naar gebruikers die zich aanmelden om uw toepassingen te gebruiken. Met behulp van de externe e-mailprovider SendGrid kunt u uw eigen e-mailsjabloon en Van: adres en onderwerp gebruiken, evenals ondersteuning voor lokalisatie en aangepaste instellingen voor eenmalig wachtwoord (OTP).

Deze functie is alleen beschikbaar voor aangepast beleid. Voor installatiestappen selecteert u Aangepast beleid in de voorgaande selector.

Aangepaste e-mailverificatie vereist het gebruik van een externe e-mailprovider, zoals SendGrid, Mailjet of SparkPost, een aangepaste REST API of een op HTTP gebaseerde e-mailprovider (inclusief uw eigen). In dit artikel wordt beschreven hoe u een oplossing instelt die gebruikmaakt van SendGrid.

Een SendGrid-account maken

Als u er nog geen hebt, begint u met het instellen van een SendGrid-account. Zie de sectie Een SendGrid-account maken voor instructies voor het verzenden van e-mail met SendGrid met Azure.

Zorg ervoor dat u de sectie voltooit waarin u een SendGrid-API-sleutel maakt. Noteer de API-sleutel voor gebruik in een latere stap.

Belangrijk

SendGrid biedt klanten de mogelijkheid om e-mailberichten te verzenden vanaf gedeeld IP-adres en toegewezen IP-adressen. Wanneer u met speciaal toegewezen IP-adressen werkt, moet u zorgvuldig uw eigen reputatie opbouwen door uw IP-adres stapsgewijs op te warmen. Zie Een IP-adres opwarmen voor meer informatie.

Azure AD B2C-beleidssleutel maken

Sla vervolgens de SendGrid-API-sleutel op in een Azure AD B2C-beleidssleutel waarnaar uw beleid moet verwijzen.

  1. Meld u aan bij het Azure-portaal.
  2. Als u toegang hebt tot meerdere tenants, selecteert u het pictogram Instellingen in het hoofdmenu om over te schakelen naar uw Azure AD B2C-tenant vanuit het menu Mappen + abonnementen.
  3. Kies in de linkerbovenhoek van de Azure-portal alle services en zoek vervolgens naar en selecteer Azure AD B2C.
  4. Selecteer Identity Experience Framework op de pagina Overzicht.
  5. Selecteer Beleidssleutels en selecteer vervolgens Toevoegen.
  6. Kies Handmatig voor Opties.
  7. Voer een naam in voor de beleidssleutel. Bijvoorbeeld: SendGridSecret. Het voorvoegsel B2C_1A_ wordt automatisch toegevoegd aan de naam van uw sleutel.
  8. Voer in Geheim de SendGrid-API-sleutel in die u eerder hebt vastgelegd.
  9. Selecteer Handtekening voor sleutelgebruik.
  10. Klik op Creëren.

SendGrid-sjabloon maken

Wanneer een SendGrid-account is gemaakt en de SendGrid-API-sleutel is opgeslagen in een Azure AD B2C-beleidssleutel, maakt u een sendGrid dynamische transactionele sjabloon.

  1. Open op de SendGrid-site de pagina transactionele sjablonen en selecteer Een dynamische sjabloon maken.

  2. Voer een unieke sjabloonnaam in, zoals Verification email en selecteer Maken.

  3. Als u wilt beginnen met het bewerken van uw nieuwe sjabloon, selecteert u de sjabloon Verification email, en selecteert u Versie toevoegen.

  4. Selecteer Lege sjabloon en vervolgens Code-editor.

  5. Plak in de HTML-editor de volgende HTML-sjabloon of gebruik uw eigen sjabloon. De {{otp}} parameters en {{email}} parameters worden dynamisch vervangen door de eenmalige wachtwoordwaarde en het e-mailadres van de gebruiker.

    <!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">
       <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 {{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: {{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>
    
  6. Vouw het menu Instellingen uit en voer voor Versienaam een sjabloonversie in.

  7. Voer bij Onderwerp{{subject}} in.

  8. Selecteer Opslaan.

  9. Ga terug naar de pagina Transactionele sjablonen door de pijl-terug te selecteren.

  10. Noteer de id van de sjabloon die u hebt gemaakt voor gebruik in een latere stap. Bijvoorbeeld: d-989077fbba9746e89f3f6411f596fb96. U geeft deze id op wanneer u de claimtransformatie toevoegt.

Belangrijk

In de volgende stappen ziet u hoe u xml-bestanden voor aangepast beleid bouwt. U wordt aangeraden een aangepast beleid voor aangepaste e-mailverificatie te gebruiken dat beschikbaar is op GitHub. DisplayControl_TrustFrameworkExtensions.xml gebruikt TrustFrameworkExtensions.xml als basisbestand, dus zorg ervoor dat u de bestanden TrustFrameworkBase.xml, TrustFrameworkLocalization.xml en TrustFrameworkExtensions.xml uit het SocialAndLocalAccountsstarterspakket in uw beleid opneemt.

Azure AD B2C-claimtypen toevoegen

Voeg in uw beleid de volgende claimtypen toe aan het <ClaimsSchema> element in <BuildingBlocks>.

Deze claimtypen zijn nodig om het e-mailadres te genereren en te verifiëren met behulp van een eenmalige wachtwoordcode (OTP).

<!-- 
<BuildingBlocks>
  <ClaimsSchema> -->
    <ClaimType Id="Otp">
      <DisplayName>Secondary One-time password</DisplayName>
      <DataType>string</DataType>
    </ClaimType>
    <ClaimType Id="emailRequestBody">
      <DisplayName>SendGrid 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> -->

De claimtransformatie toevoegen

Vervolgens hebt u een claimtransformatie nodig om een JSON-tekenreeksclaim uit te voeren die de hoofdtekst vormt van de aanvraag die naar SendGrid wordt verzonden.

De structuur van het JSON-object wordt gedefinieerd door de id's in puntnotatie van de InputParameters en de TransformationClaimTypes van de InputClaims. Getallen in de puntnotatie impliceren matrices. De waarden zijn afkomstig uit de waarden van InputClaims en de eigenschappen 'Value' van InputParameters. Voor meer informatie over JSON-claims-transformaties, zie JSON-claims-transformaties.

Voeg de volgende claimtransformatie toe aan het <ClaimsTransformations> element binnen <BuildingBlocks>. Voer de volgende updates uit voor de XML van de claimtransformatie:

  • Werk de template_id InputParameterwaarde bij met de ID van de SendGrid-transactionele sjabloon die u eerder hebt gemaakt bij SendGrid-sjabloon maken.
  • Werk de from.email adreswaarde bij. Gebruik een geldig e-mailadres om te voorkomen dat de verificatie-e-mail wordt gemarkeerd als spam.

    Notitie

    Dit e-mailadres moet worden geverifieerd in SendGrid onder Afzenderverificatie met domeinverificatie of Verificatie met één afzender.

  • Werk de waarde van de invoerparameter voor de personalizations.0.dynamic_template_data.subject onderwerpregel bij met een onderwerpregel die geschikt is voor uw organisatie.
<!-- 
<BuildingBlocks>
  <ClaimsTransformations> -->
    <ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="personalizations.0.to.0.email" />
        <InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="personalizations.0.dynamic_template_data.otp" />
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="personalizations.0.dynamic_template_data.email" />
      </InputClaims>
      <InputParameters>
        <!-- Update the template_id value with the ID of your SendGrid template. -->
        <InputParameter Id="template_id" DataType="string" Value="d-989077fbba9746e89f3f6411f596fb96"/>
        <InputParameter Id="from.email" DataType="string" Value="my_email@mydomain.com"/>
        <!-- Update with a subject line appropriate for your organization. -->
        <InputParameter Id="personalizations.0.dynamic_template_data.subject" DataType="string" Value="Contoso account email verification code"/>
      </InputParameters>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim"/>
      </OutputClaims>
    </ClaimsTransformation>
  <!--
  </ClaimsTransformations>
</BuildingBlocks> -->

Definitie van DataUri-inhoud toevoegen

Voeg onder de claimtransformaties binnen <BuildingBlocks>de volgende ContentDefinition toe om te verwijzen naar de gegevens-URI van versie 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> -->

Een DisplayControl maken

Een verificatieschermcontrole wordt gebruikt om het e-mailadres te verifiëren met een verificatiecode die de gebruiker ontvangt.

Dit voorbeeldweergavebeheer is geconfigureerd voor:

  1. Verzamel het email adresclaimtype van de gebruiker.

  2. Genereer met behulp van de SendCode actie een OTP-code en verzend een e-mail met de OTP-code naar de gebruiker.

    E-mailactie verificatiecode verzenden

  3. Wacht totdat de gebruiker de verificationCode claimsoort heeft opgegeven met de code die naar de gebruiker is verzonden.

  4. email Ga terug naar het zelfbeveerde technische profiel met een verwijzing naar dit weergavebesturingselement.

Voeg onder inhoudsdefinities, nog steeds binnen <BuildingBlocks>, de volgende DisplayControl van het type VerificationControl toe aan uw beleid.

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

Technische OTP-profielen toevoegen

Het GenerateOtp technische profiel genereert een code voor het e-mailadres. Het VerifyOtp technische profiel controleert de code die is gekoppeld aan het e-mailadres. U kunt de configuratie van de indeling en de vervaldatum van het eenmalige wachtwoord wijzigen. Zie Een technisch profiel voor eenmalige wachtwoorden definiëren voor meer informatie over technische OTP-profielen.

Notitie

OTP-codes die worden gegenereerd door het protocol Web.TPEngine.Providers.OneTimePasswordProtocolProvider, zijn gekoppeld aan de browsersessie. Dit betekent dat een gebruiker unieke OTP-codes kan genereren in verschillende browsersessies die elk geldig zijn voor hun bijbehorende sessies. Een OTP-code die door de ingebouwde e-mailprovider wordt gegenereerd, is daarentegen onafhankelijk van de browsersessie, dus als een gebruiker een nieuwe OTP-code in een nieuwe browsersessie genereert, vervangt deze de vorige OTP-code.

Voeg de volgende technische profielen toe aan het <ClaimsProviders> element.

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

Een technisch REST API-profiel toevoegen

Met dit technische REST API-profiel wordt de e-mailinhoud gegenereerd (gebruikmakend van de SendGrid-indeling). Zie Een RESTful-technisch profiel definiëren voor meer informatie over RESTful-technische profielen.

Voeg net als bij de technische OTP-profielen de volgende technische profielen toe aan het <ClaimsProviders> element.

<ClaimsProvider>
  <DisplayName>RestfulProvider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="SendOtp">
      <DisplayName>Use SendGrid's 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.sendgrid.com/v3/mail/send</Item>
        <Item Key="AuthenticationType">Bearer</Item>
        <Item Key="SendClaimsIn">Body</Item>
        <Item Key="ClaimUsedForRequestPayload">emailRequestBody</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="BearerAuthenticationToken" StorageReferenceId="B2C_1A_SendGridSecret" />
      </CryptographicKeys>
      <InputClaimsTransformations>
        <InputClaimsTransformation ReferenceId="GenerateEmailRequestBody" />
      </InputClaimsTransformations>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="emailRequestBody" />
      </InputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

Een verwijzing maken naar DisplayControl

Voeg in de laatste stap een verwijzing toe naar de DisplayControl die u hebt gemaakt. Overschrijf uw bestaande LocalAccountSignUpWithLogonEmail en LocalAccountDiscoveryUsingEmailAddress zelfverklaarde technische profielen zoals geconfigureerd in het basisbeleid met het volgende XML-fragment. Als u een eerdere versie van het Azure AD B2C-beleid hebt gebruikt, gebruiken deze technische profielen DisplayClaims met een verwijzing naar de DisplayControl.

Zie Self-asserted technical profile en DisplayControl voor meer informatie.

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

[Optioneel] Uw e-mail lokaliseren

Als u de e-mail wilt lokaliseren, moet u gelokaliseerde tekenreeksen verzenden naar SendGrid of uw e-mailprovider. U kunt bijvoorbeeld het onderwerp van de e-mail, hoofdtekst, het codebericht of de handtekening van het e-mailbericht lokaliseren. Hiervoor kunt u de GetLocalizedStringsTransformation gebruiken om gelokaliseerde tekenreeksen te kopiëren naar claimtypen. De GenerateEmailRequestBody claimtransformatie, die de JSON-nettolading genereert, maakt gebruik van invoerclaims die de gelokaliseerde tekenreeksen bevatten.

  1. Definieer in uw beleid de volgende tekenreeksclaims: onderwerp, bericht, codeIntro en handtekening.

  2. Definieer een transformatie van GetLocalizedStringsTransformation-claims om gelokaliseerde tekenreekswaarden in de claims van stap 1 te vervangen.

  3. Wijzig de GenerateEmailRequestBody claimtransformatie om invoerclaims te gebruiken met het volgende XML-fragment.

  4. Werk uw SendGrid-sjabloon bij om dynamische parameters te gebruiken in plaats van alle tekenreeksen die door Azure AD B2C worden gelokaliseerd.

    <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="personalizations.0.to.0.email" />
        <InputClaim ClaimTypeReferenceId="subject" TransformationClaimType="personalizations.0.dynamic_template_data.subject" />
        <InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="personalizations.0.dynamic_template_data.otp" />
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="personalizations.0.dynamic_template_data.email" />
        <InputClaim ClaimTypeReferenceId="message" TransformationClaimType="personalizations.0.dynamic_template_data.message" />
        <InputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="personalizations.0.dynamic_template_data.codeIntro" />
        <InputClaim ClaimTypeReferenceId="signature" TransformationClaimType="personalizations.0.dynamic_template_data.signature" />
      </InputClaims>
      <InputParameters>
        <InputParameter Id="template_id" DataType="string" Value="d-1234567890" />
        <InputParameter Id="from.email" DataType="string" Value="my_email@mydomain.com" />
      </InputParameters>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim" />
      </OutputClaims>
    </ClaimsTransformation>
    
  5. Voeg het volgende lokalisatieelement toe.

    <!--
    <BuildingBlocks> -->
      <Localization Enabled="true">
        <SupportedLanguages DefaultLanguage="en" MergeBehavior="ReplaceAll">
          <SupportedLanguage>en</SupportedLanguage>
          <SupportedLanguage>es</SupportedLanguage>
        </SupportedLanguages>
        <LocalizedResources Id="api.custom-email.en">
          <LocalizedStrings>
            <!--Email template parameters-->
            <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>
            <!--Email template parameters-->
            <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. Voeg verwijzingen toe aan de elementen LocalizedResources door het element ContentDefinitions bij te werken.

    <!--
    <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. Voeg ten slotte de volgende transformatie van invoerclaims toe aan de LocalAccountSignUpWithLogonEmail en LocalAccountDiscoveryUsingEmailAddress technische profielen.

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

[Optioneel] De gebruikersinterface lokaliseren

Met het element Lokalisatie kunt u meerdere landinstellingen of talen in het beleid voor de gebruikersbelevingen ondersteunen. Met de lokalisatieondersteuning in beleidsregels kunt u taalspecifieke tekenreeksen opgeven voor zowel elementen van de gebruikersinterface voor verificatieweergave als eenmalige wachtwoordfoutberichten. Voeg de volgende LocalizedString toe aan 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="VerificationCode" StringId="DisplayName">Verification Code</LocalizedString>
    <LocalizedString ElementType="ClaimType" ElementId="VerificationCode" StringId="UserHelpText">Verification code received in the email.</LocalizedString>
    <LocalizedString ElementType="ClaimType" ElementId="VerificationCode" 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>