Share via


Aangepaste e-mailverificatie met SendGrid

Voordat u begint, gebruikt u de selector Een beleidstype kiezen 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-mails in Azure Active Directory B2C (Azure AD B2C) om aangepaste e-mails 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 configuratiestappen 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 toegewezen IP-adressen gebruikt, moet u uw eigen reputatie goed opbouwen met een IP-adreswarmer. Zie Een IP-adres opwarmen voor meer informatie.

Een 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 de Azure-portal.
  2. Als u toegang hebt tot meerdere tenants, selecteert u het pictogram Instellingen in het bovenste menu om over te schakelen naar uw Azure AD B2C-tenant in het menu Mappen en abonnementen.
  3. Kies in de linkerbovenhoek van Azure Portal alle services en zoek en selecteer Vervolgens Azure AD B2C.
  4. Selecteer Identity Experience Framework op de overzichtspagina.
  5. Selecteer Beleidssleutels en 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. Selecteer Maken.

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 Vervolgens Maken.

  3. Als u wilt beginnen met het bewerken van de nieuwe sjabloon, selecteert u de sjabloon die dat wil Verification email, en selecteert u Vervolgens 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 Instellingen menu uit en voer voor Versienaam een sjabloonversie in.

  7. Voer voor Onderwerp de tekst in {{subject}}.

  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 voorbeeldbeleid voor verificatie van aangepaste e-mails te gebruiken dat beschikbaar is op GitHub. DisplayControl_TrustFrameworkExtensions.xml gebruikt TrustFrameworkExtensions.xml als basisbestand. Zorg er daarom voor dat u bestanden TrustFrameworkBase.xml, TrustFrameworkLocalization.xml en TrustFrameworkExtensions.xml uit het starterspakketSocialAndLocalAccounts in uw beleid opneemt.

Azure AD B2C-claimtypen toevoegen

Voeg in uw beleid de volgende claimtypen toe aan het element <ClaimsSchema> 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 aanroepen

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. Zie JSON-claimtransformaties voor meer informatie over JSON-claimtransformaties.

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

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

    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 onderwerpregel personalizations.0.dynamic_template_data.subject 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 voor 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

Er wordt een controlebeheer voor verificatie gebruikt om het e-mailadres te verifiëren met een verificatiecode die de gebruiker ontvangt.

Dit voorbeeldweergavebeheer is geconfigureerd om:

  1. Het adresclaimtype email van de gebruiker te verzamelen.

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

    Send verification code email action

  3. Wacht totdat de gebruiker het claimtype verificationCode 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> -->

OTP-technische profielen toevoegen

Het technische profiel GenerateOtp genereert een code voor het e-mailadres. Het technische profiel VerifyOtp controleert de code die is gekoppeld aan het e-mailadres. U kunt de configuratie van de indeling en het verlopen van het eenmalige wachtwoord wijzigen. Zie Een eenmalig wachtwoord voor een technisch profiel definiëren voor meer informatie over OTP-technische 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 wordt gegenereerd door de ingebouwde e-mailprovider, 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 element <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> -->

Een technisch REST API-profiel toevoegen

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

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

<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 zelfbewuste technische profielen die zijn geconfigureerd in het basisbeleid met het volgende XML-fragment. Als u een eerdere versie van Azure AD B2C-beleid hebt gebruikt, gebruiken deze technische profielen DisplayClaims met een verwijzing naar de DisplayControl.

Zie voor meer informatie Zelfbewust technisch profiel en 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>

[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 e-mailonderwerp, de hoofdtekst, het codebericht of de handtekening van het e-mailbericht lokaliseren. Hiervoor kunt u de claimstransformatie getLocalizedStringsTransformation gebruiken om gelokaliseerde tekenreeksen te kopiëren naar claimtypen. De claimtransformatie GenerateEmailRequestBody, die de JSON-payload 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 claimstransformatie GetLocalizedStringsTransformation om gelokaliseerde tekenreekswaarden in de claims van stap 1 te vervangen.

  3. Wijzig de claimstransformatie GenerateEmailRequestBody 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 lokalisatie-element 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 naar 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 technische profielen LocalAccountSignUpWithLogonEmail en LocalAccountDiscoveryUsingEmailAddress.

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

[Optioneel] De gebruikersinterface lokaliseren

Met het lokalisatie-element kunt u meerdere landinstellingen of talen in het beleid voor de gebruikerstrajecten 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="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>

Volgende stappen