Ověření vlastního e-mailu pomocí SendGridu

Než začnete, pomocí selektoru Zvolit typ zásady zvolte typ zásady, kterou nastavujete. Azure Active Directory B2C nabízí dvě metody pro definování způsobu interakce uživatelů s vašimi aplikacemi: prostřednictvím předdefinovaných toků uživatelů nebo prostřednictvím plně konfigurovatelných vlastních zásad. Kroky vyžadované v tomto článku se pro každou metodu liší.

Pomocí vlastního e-mailu v Azure Active Directory B2C (Azure AD B2C) můžete uživatelům, kteří se zaregistrují k používání vašich aplikací, odesílat přizpůsobené e-maily. Pomocí poskytovatele e-mailu Třetí strany SendGrid můžete použít vlastní e-mailovou šablonu a odesílatele: adresu a předmět a také podporovat lokalizaci a vlastní jednorázové heslo (OTP).

Tato funkce je dostupná jenom pro vlastní zásady. Pro kroky nastavení vyberte v předchozím selektoru vlastní zásady .

Vlastní ověření e-mailu vyžaduje použití poskytovatele e-mailu třetí strany, jako je SendGrid, Mailjet nebo SparkPost, vlastní rozhraní REST API nebo libovolného poskytovatele e-mailu založeného na protokolu HTTP (včetně vašeho vlastního). Tento článek popisuje nastavení řešení, které používá SendGrid.

Vytvoření účtu SendGrid

Pokud ho ještě nemáte, začněte nastavením účtu SendGrid. Pokyny k nastavení najdete v části Vytvoření účtu SendGrid v části Jak odesílat e-maily pomocí SendGridu s Azure.

Ujistěte se, že jste dokončili část, ve které vytvoříte klíč rozhraní API SendGrid. Poznamenejte si klíč rozhraní API pro pozdější použití.

Důležité

SendGrid nabízí zákazníkům možnost odesílat e-maily ze sdílených IP adres a vyhrazených IP adres. Při použití vyhrazených IP adres je potřeba správně vytvořit vlastní reputaci pomocí zahřátí IP adresy. Další informace najdete v tématu Oteplení IP adresy.

Vytvoření klíče zásad Azure AD B2C

Dále uložte klíč rozhraní SENDGrid API do klíče zásad Azure AD B2C, na který se mají zásady odkazovat.

  1. Přihlaste se k portálu Azure.
  2. Pokud máte přístup k více tenantům, v horní nabídce vyberte ikonu Nastavení a v nabídce Adresáře a předplatná přepněte do svého tenanta Azure AD B2C.
  3. V levém horním rohu webu Azure Portal zvolte Všechny služby a pak vyhledejte a vyberte Azure AD B2C.
  4. Na stránce Přehled vyberte rozhraní Identity Experience Framework.
  5. Vyberte Klíče zásad a pak vyberte Přidat.
  6. V nabídce Možnosti zvolte Ručně.
  7. Zadejte název klíče zásady. Například, SendGridSecret. Předpona B2C_1A_ se automaticky přidá do názvu klíče.
  8. V tajném kódu zadejte klíč rozhraní API SendGrid, který jste si předtím poznamenali.
  9. V případě použití klíče vyberte Podpis.
  10. Vyberte Vytvořit.

Vytvoření šablony SendGrid

Pomocí účtu SendGrid vytvořeného a klíče rozhraní SendGrid API uloženého v klíči zásad Azure AD B2C vytvořte dynamickou transakční šablonu SendGrid.

  1. Na webu SendGrid otevřete stránku transakčních šablon a vyberte Vytvořit dynamickou šablonu.

  2. Zadejte jedinečný název šablony, například Verification email a pak vyberte Vytvořit.

  3. Pokud chcete začít upravovat novou šablonu, vyberte šablonu, která je, Verification emaila pak vyberte Přidat verzi.

  4. Vyberte prázdnou šablonu a pak Editor kódu.

  5. V editoru HTML vložte následující šablonu HTML nebo použijte vlastní. Parametry {{otp}} se {{email}} dynamicky nahrazují hodnotou jednorázového hesla a e-mailovou adresou uživatele.

    <!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. Rozbalte nabídku Nastavení a jako název verze zadejte verzi šablony.

  7. Do předmětu zadejte {{subject}}.

  8. Zvolte Uložit.

  9. Vraťte se na stránku Transakční šablony výběrem šipky zpět.

  10. Poznamenejte si ID šablony, kterou jste vytvořili pro použití v pozdějším kroku. Například, d-989077fbba9746e89f3f6411f596fb96. Toto ID zadáte při přidání transformace deklarací identity.

Důležité

V dalších krocích se dozvíte, jak vytvořit vlastní soubory XML zásad. Doporučujeme použít ukázkovou vlastní zásadu vlastního ověření e-mailu dostupnou na GitHubu. DisplayControl_TrustFrameworkExtensions.xmlpoužívá TrustFrameworkExtensions.xml jako základní soubor, proto nezapomeňte do zásad zahrnout TrustFrameworkLocalization.xmlTrustFrameworkBase.xmlsoubory z TrustFrameworkExtensions.xml úvodního balíčku SocialAndLocalAccounts.

Přidání typů deklarací identity Azure AD B2C

V zásadách přidejte následující typy deklarací identity do elementu <ClaimsSchema> v rámci <BuildingBlocks>.

Tyto typy deklarací identity jsou nezbytné k vygenerování a ověření e-mailové adresy pomocí jednorázového hesla (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> -->

Přidání transformace deklarací identity

Dále potřebujete transformaci deklarací identity pro výstup deklarace řetězce JSON, která tvoří tělo požadavku odeslaného do SendGridu.

Struktura objektu JSON je definována ID v tečkované notaci InputParameters a TransformationClaimTypes InputClaimTypes InputClaims. Čísla v zápisu tečky znamenají pole. Hodnoty pocházejí z hodnot InputClaims' a InputParameters' "Value" vlastnosti. Další informace o transformacích deklarací identity JSON najdete v tématu Transformace deklarací identity JSON.

Přidejte následující transformaci deklarací identity do elementu <ClaimsTransformations> v rámci <BuildingBlocks>. Proveďte následující aktualizace xml transformace deklarací identity:

  • template_id Aktualizujte hodnotu InputParameter pomocí ID transakční šablony SendGrid, kterou jste vytvořili dříve v šabloně Create SendGrid.
  • Aktualizujte from.email hodnotu adresy. Použijte platnou e-mailovou adresu, abyste zabránili označení ověřovacího e-mailu jako spamu.

    Poznámka:

    Tato e-mailová adresa musí být ověřena ve službě SendGrid v části Ověřování odesílatele s ověřováním domény nebo ověřováním jednoho odesílatele.

  • Aktualizujte hodnotu vstupního parametru personalizations.0.dynamic_template_data.subject řádku předmětu pomocí řádku předmětu, který je vhodný pro vaši organizaci.
<!-- 
<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> -->

Přidání definice obsahu identifikátoru DataUri

Pod transformace deklarací identity v rámci <BuildingBlocks>přidejte následující ContentDefinition odkaz na identifikátor URI dat verze 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> -->

Vytvoření DisplayControl

Ovládací prvek zobrazení ověření slouží k ověření e-mailové adresy s ověřovacím kódem, který uživatel obdrží.

Tento příklad ovládacího prvku zobrazení je nakonfigurován na:

  1. Shromážděte email typ deklarace identity adresy od uživatele.

  2. SendCode Pomocí akce vygenerujte kód jednorázového hesla a odešlete uživateli e-mail s kódem jednorázového hesla.

    Send verification code email action

  3. Počkejte, až uživatel zadá verificationCode typ deklarace identity s kódem odeslaným uživateli.

  4. email Vraťte zpět do technického profilu s vlastním kontrolním výrazem, který má odkaz na tento ovládací prvek zobrazení.

V části definice obsahu, stále uvnitř <BuildingBlocks>, přidejte následující DisplayControl typu VerificationControl do zásad.

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

Přidání technických profilů jednorázového hesla

Technický GenerateOtp profil vygeneruje kód pro e-mailovou adresu. VerifyOtp Technický profil ověří kód přidružený k e-mailové adrese. Můžete změnit konfiguraci formátu a vypršení platnosti jednorázového hesla. Další informace o technických profilech jednorázového hesla najdete v tématu Definování jednorázového technického profilu hesla.

Poznámka:

Kódy jednorázového hesla vygenerované protokolem Web.TPEngine.Providers.OneTimePasswordProtocolProvider jsou svázané s relací prohlížeče. To znamená, že uživatel může vygenerovat jedinečné kódy jednorázového hesla v různých relacích prohlížeče, které jsou platné pro odpovídající relace. Naproti tomu kód jednorázového hesla vygenerovaný předdefinovaným poskytovatelem e-mailu je nezávislý na relaci prohlížeče, takže pokud uživatel vygeneruje nový kód jednorázového hesla v nové relaci prohlížeče, nahradí předchozí kód jednorázového hesla.

Do elementu <ClaimsProviders> přidejte následující technické profily.

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

Přidání technického profilu rozhraní REST API

Tento technický profil rozhraní REST API generuje obsah e-mailu (pomocí formátu SendGrid). Další informace o technických profilech RESTful najdete v tématu Definování technického profilu RESTful.

Stejně jako u technických profilů jednorázového hesla přidejte do <ClaimsProviders> prvku následující technické profily.

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

Vytvoření odkazu na DisplayControl

V posledním kroku přidejte odkaz na DisplayControl, který jste vytvořili. Přepište stávající LocalAccountSignUpWithLogonEmail technické profily s LocalAccountDiscoveryUsingEmailAddress vlastním kontrolním výrazem, které jsou nakonfigurované v základní zásadě, následujícím fragmentem kódu XML. Pokud jste použili starší verzi zásad Azure AD B2C, tyto technické profily se používají DisplayClaims s odkazem na zásadu DisplayControl.

Další informace naleznete v tématu Self-asserted technického profilu a 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>

[Volitelné] Lokalizace e-mailu

Pokud chcete e-mail lokalizovat, musíte odeslat lokalizované řetězce do SendGridu nebo poskytovatele e-mailu. Můžete například lokalizovat předmět e-mailu, text, zprávu s kódem nebo podpis e-mailu. Uděláte to tak, že pomocí transformace deklarací identity GetLocalizedStringsTransformation zkopírujete lokalizované řetězce do typů deklarací. Transformace GenerateEmailRequestBody deklarací identity, která generuje datovou část JSON, používá vstupní deklarace identity, které obsahují lokalizované řetězce.

  1. V zásadách definujte následující řetězcové deklarace identity: předmět, zpráva, codeIntro a podpis.

  2. Definujte transformaci deklarací identity GetLocalizedStringsTransformation, která nahradí lokalizované řetězcové hodnoty do deklarací identity z kroku 1.

  3. GenerateEmailRequestBody Změňte transformaci deklarací identity tak, aby používala vstupní deklarace identity s následujícím fragmentem kódu XML.

  4. Aktualizujte šablonu SendGrid tak, aby používala dynamické parametry místo všech řetězců, které azure AD B2C lokalizuje.

    <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. Přidejte následující element lokalizace .

    <!--
    <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. Přidejte odkazy na elementy LocalizedResources aktualizací ContentDefinitions elementu.

    <!--
    <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. Nakonec do profilů a LocalAccountDiscoveryUsingEmailAddress technických profilů přidejte následující vstupní transformaci LocalAccountSignUpWithLogonEmail deklarací identity.

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

[Volitelné] Lokalizace uživatelského rozhraní

Element Lokalizace umožňuje podporovat více národních prostředí nebo jazyků v zásadách pro cesty uživatele. Podpora lokalizace v zásadách umožňuje poskytovat řetězce specifické pro jazyk pro prvky uživatelského rozhraní pro ovládací prvek zobrazení ověření i chybové zprávy Jednorázové heslo. Přidejte následující LocalizedString do vašich 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>

Další kroky