Aracılığıyla paylaş


SendGrid ile özel e-posta doğrulaması

Başlamadan önce, ayarladığınız ilke türünü seçmek için İlke türü seçin seçicisini kullanın. Azure Active Directory B2C, kullanıcıların uygulamalarınızla nasıl etkileşim kurduğunu tanımlamak için iki yöntem sunar: önceden tanımlanmış kullanıcı akışları veya tam olarak yapılandırılabilir özel ilkeler aracılığıyla. Bu makalede gerekli adımlar her yöntem için farklıdır.

Uygulamalarınızı kullanmak üzere kaydolan kullanıcılara özelleştirilmiş e-posta göndermek için Azure Active Directory B2C'de (Azure AD B2C) özel e-posta kullanın. Üçüncü taraf e-posta sağlayıcısı SendGrid'i kullanarak kendi e-posta şablonunuzu ve Kimden: adres ve konu bilgilerini kullanabilir, ayrıca yerelleştirmeyi ve özel tek seferlik parola (OTP) ayarlarını destekleyebilirsiniz.

Bu özellik yalnızca özel ilkeler için kullanılabilir. Kurulum adımları için, önceki seçicide Özel ilke'yi seçin.

Özel e-posta doğrulaması için SendGrid, Mailjet veya SparkPost gibi bir üçüncü taraf e-posta sağlayıcısının, özel bir REST API'nin veya http tabanlı e-posta sağlayıcısının (sizinki dahil) kullanılması gerekir. Bu makalede SendGrid kullanan bir çözüm ayarlama açıklanmaktadır.

SendGrid hesabı oluşturma

Henüz bir hesabınız yoksa, bir SendGrid hesabı ayarlayarak başlayın. Kurulum yönergeleri için Azure ile SendGrid kullanarak e-posta gönderme bölümünün SendGrid Hesabı Oluşturma bölümüne bakın.

SendGrid API anahtarı oluşturduğunuz bölümü tamamladığınızdan emin olun. Api anahtarını daha sonraki bir adımda kullanmak üzere kaydedin.

Önemli

SendGrid müşterilere paylaşılan IP ve ayrılmış IP adreslerinden e-posta gönderme olanağı sunar. Ayrılmış IP adreslerini kullanırken, IP adresi ısınması ile kendi itibarınızı düzgün bir şekilde oluşturmanız gerekir. Daha fazla bilgi için bkz . Ip Adresini Hazırlama.

Azure AD B2C ilke anahtarı oluşturma

Ardından, ilkelerinizin başvurması için SendGrid API anahtarını bir Azure AD B2C ilke anahtarında depolayın.

  1. Azure Portal oturum açın.
  2. Birden çok kiracıya erişiminiz varsa, Dizinler + abonelikler menüsünden Azure AD B2C kiracınıza geçmek için üstteki menüden Ayarlar simgesini seçin.
  3. Azure portalının sol üst köşesinde Tüm hizmetler'i seçin ve ardından Azure AD B2C'yi arayıp seçin.
  4. Genel Bakış sayfasında Kimlik Deneyimi Çerçevesi'ni seçin.
  5. İlke Anahtarları'nı ve ardından Ekle'yi seçin.
  6. Seçenekler için El ile'yi seçin.
  7. İlke anahtarı için bir Ad girin. Örneğin, SendGridSecret. Ön ek B2C_1A_ , anahtarınızın adına otomatik olarak eklenir.
  8. Gizli Dizi alanına daha önce kaydettiğiniz SendGrid API anahtarını girin.
  9. Anahtar kullanımı için İmza'yı seçin.
  10. Oluştur’u seçin.

SendGrid şablonu oluşturma

Bir SendGrid hesabı oluşturulduğunda ve Azure AD B2C ilke anahtarında depolanan SendGrid API anahtarıyla bir SendGrid dinamik işlem şablonu oluşturun.

  1. SendGrid sitesinde işlem şablonları sayfasını açın ve Dinamik Şablon Oluştur'u seçin.

  2. gibi Verification email benzersiz bir şablon adı girin ve Oluştur'u seçin.

  3. Yeni şablonunuzu düzenlemeye başlamak için, olan Verification emailşablonu seçin ve ardından Sürüm Ekle'yi seçin.

  4. Boş Şablon'a ve ardından Kod Düzenleyicisi'ne tıklayın.

  5. HTML düzenleyicisinde aşağıdaki HTML şablonunu yapıştırın veya kendi şablonunuzu kullanın. {{otp}} ve {{email}} parametreleri dinamik olarak tek seferlik parola değeri ve kullanıcı e-posta adresiyle değiştirilir.

    <!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. Ayarlar menüsünü genişletin ve Sürüm Adı için bir şablon sürümü girin.

  7. Konu alanına girin{{subject}}.

  8. Kaydet'i seçin.

  9. Geri okunu seçerek İşlem Şablonları sayfasına dönün.

  10. Daha sonraki bir adımda kullanmak üzere oluşturduğunuz şablonun kimliğini kaydedin. Örneğin, d-989077fbba9746e89f3f6411f596fb96. Talep dönüştürmesini eklerken bu kimliği belirtirsiniz.

Önemli

Sonraki adımlarda özel ilke XML dosyalarınızı nasıl oluşturabileceğiniz gösterilmektedir. GitHub'da kullanılabilen örnek bir Özel e-posta doğrulama özel ilkesi kullanmanızı öneririz. DisplayControl_TrustFrameworkExtensions.xmltemel dosyası olarak kullanırTrustFrameworkExtensions.xml, bu nedenle ilkenize SocialAndLocalAccountsbaşlangıç paketinden ve TrustFrameworkLocalization.xmlTrustFrameworkExtensions.xml dosyalarını eklediğinizden TrustFrameworkBase.xmlemin olun.

Azure AD B2C talep türleri ekleme

İlkenizde, içindeki <BuildingBlocks>öğesine aşağıdaki talep türlerini <ClaimsSchema> ekleyin.

Bu talep türleri, tek seferlik parola (OTP) kodu kullanarak e-posta adresini oluşturmak ve doğrulamak için gereklidir.

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

Talep dönüştürmesini ekleme

Ardından, SendGrid'e gönderilen isteğin gövdesini oluşturan bir JSON dize talebinin çıktısını almak için bir talep dönüştürmesi gerekir.

JSON nesnesinin yapısı, InputParameters'ın noktalı gösterimi ve InputClaims'in TransformationClaimTypes kimlikleri tarafından tanımlanır. Nokta gösterimindeki sayılar dizileri ifade eder. Değerler InputClaims'in değerlerinden ve InputParameters'ın "Value" özelliklerinden gelir. JSON talep dönüştürmeleri hakkında daha fazla bilgi için bkz . JSON talep dönüştürmeleri.

içindeki <BuildingBlocks>öğesine aşağıdaki talep dönüştürmesini <ClaimsTransformations> ekleyin. Talep dönüştürme XML'sinde aşağıdaki güncelleştirmeleri yapın:

  • template_id InputParameter değerini, daha önce SendGrid şablonu oluşturma bölümünde oluşturduğunuz SendGrid işlem şablonunun kimliğiyle güncelleştirin.
  • Adres değerini güncelleştirin from.email . Doğrulama e-postasının istenmeyen posta olarak işaretlenmesini önlemeye yardımcı olması için geçerli bir e-posta adresi kullanın.

    Dekont

    Bu e-posta adresi SendGrid'de, etki alanı kimlik doğrulaması veya Tek Gönderen Kimlik Doğrulaması ile Gönderen Kimlik Doğrulaması altında doğrulanmalıdır.

  • Konu satırı giriş parametresinin personalizations.0.dynamic_template_data.subject değerini kuruluşunuza uygun bir konu satırıyla güncelleştirin.
<!-- 
<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> -->

DataUri içerik tanımı ekleme

içindeki <BuildingBlocks>talep dönüştürmelerinin altına, sürüm 2.1.2 veri URI'sine başvurmak için aşağıdaki ContentDefinition öğesini ekleyin:

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

DisplayControl oluşturma

Kullanıcının aldığı bir doğrulama koduyla e-posta adresini doğrulamak için doğrulama görüntüleme denetimi kullanılır.

Bu örnek görüntüleme denetimi şu şekilde yapılandırılmıştır:

  1. Kullanıcıdan email adres talep türünü toplayın.

  2. eylemini SendCode kullanarak bir OTP kodu oluşturun ve kullanıcıya OTP kodunu içeren bir e-posta gönderin.

    Send verification code email action

  3. Kullanıcının talep türünü kullanıcıya gönderilen kodu sağlamasını verificationCode bekleyin.

  4. email Bu görüntü denetimine başvuru içeren kendi kendine onaylanan teknik profile geri dönün.

İçerik tanımlarının altında, hala içinde<BuildingBlocks>, ilkenize VerificationControl türünde aşağıdaki DisplayControl öğesini ekleyin.

<!--
<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 teknik profilleri ekleme

Teknik GenerateOtp profil, e-posta adresi için bir kod oluşturur. Teknik VerifyOtp profil, e-posta adresiyle ilişkili kodu doğrular. Biçimin yapılandırmasını ve tek seferlik parolanın süre sonunu değiştirebilirsiniz. OTP teknik profilleri hakkında daha fazla bilgi için bkz . Tek seferlik parola teknik profili tanımlama.

Dekont

Web.TPEngine.Providers.OneTimePasswordProtocolProvider protokolü tarafından oluşturulan OTP kodları tarayıcı oturumuna bağlıdır. Bu, kullanıcının her birinin ilgili oturumları için geçerli olan farklı tarayıcı oturumlarında benzersiz OTP kodları oluşturabileceği anlamına gelir. Buna karşılık, yerleşik e-posta sağlayıcısı tarafından oluşturulan bir OTP kodu tarayıcı oturumundan bağımsızdır, bu nedenle kullanıcı yeni bir tarayıcı oturumunda yeni bir OTP kodu oluşturursa, önceki OTP kodunun yerini alır.

öğesine aşağıdaki teknik profilleri <ClaimsProviders> ekleyin.

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

REST API teknik profili ekleme

Bu REST API teknik profili, e-posta içeriğini oluşturur (SendGrid biçimini kullanarak). RESTful teknik profilleri hakkında daha fazla bilgi için bkz . RESTful teknik profili tanımlama.

OTP teknik profillerinde olduğu gibi öğesine aşağıdaki teknik profilleri <ClaimsProviders> ekleyin.

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

DisplayControl'e başvuru yapma

Son adımda, oluşturduğunuz DisplayControl'e bir başvuru ekleyin. Temel ilkede yapılandırılan mevcut LocalAccountSignUpWithLogonEmail ve LocalAccountDiscoveryUsingEmailAddress kendi kendine onaylanan teknik profillerinizi aşağıdaki XML kod parçacığıyla geçersiz kılın. Azure AD B2C ilkesinin önceki bir sürümünü kullandıysanız, bu teknik profiller başvurusuyla DisplayControlkullanırDisplayClaims.

Daha fazla bilgi için bkz . Kendi kendine onaylanan teknik profil ve 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>

[İsteğe bağlı] E-postanızı yerelleştirme

E-postayı yerelleştirmek için SendGrid'e veya e-posta sağlayıcınıza yerelleştirilmiş dizeler göndermeniz gerekir. Örneğin, e-posta konusunu, gövdesini, kod iletinizi veya e-postanın imzasını yerelleştirebilirsiniz. Bunu yapmak için GetLocalizedStringsTransformation talep dönüştürmesini kullanarak yerelleştirilmiş dizeleri talep türlerine kopyalayabilirsiniz. GenerateEmailRequestBody JSON yükünü oluşturan talep dönüştürmesi, yerelleştirilmiş dizeleri içeren giriş taleplerini kullanır.

  1. İlkenizde şu dize taleplerini tanımlayın: konu, ileti, kodIntro ve imza.

  2. Yerelleştirilmiş dize değerlerini 1. adımdaki taleplerle değiştirmek için GetLocalizedStringsTransformation talep dönüştürmesi tanımlayın.

  3. GenerateEmailRequestBody Aşağıdaki XML kod parçacığıyla giriş taleplerini kullanmak için talep dönüştürmesini değiştirin.

  4. SendGrid şablonunuzu, Azure AD B2C'nin yerelleştirmiş olduğu tüm dizeler yerine dinamik parametreleri kullanacak şekilde güncelleştirin.

    <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. Aşağıdaki Localization öğesini ekleyin.

    <!--
    <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. ContentDefinitions öğesini güncelleştirerek LocalizedResources öğelerine başvurular ekleyin.

    <!--
    <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. Son olarak ve LocalAccountDiscoveryUsingEmailAddress teknik profillerine aşağıdaki giriş talepleri dönüştürmesini LocalAccountSignUpWithLogonEmail ekleyin.

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

[İsteğe bağlı] Kullanıcı arabirimini yerelleştirme

Localization öğesi, kullanıcı yolculukları için ilkede birden çok yerel ayarı veya dili desteklemenizi sağlar. İlkelerdeki yerelleştirme desteği, hem Doğrulama görüntüleme denetimi kullanıcı arabirimi öğeleri hem de Bir kerelik parola hata iletileri için dile özgü dizeler sağlamanıza olanak tanır. LocalizedResources'unuza aşağıdaki LocalizedString öğesini ekleyin.

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

Sonraki adımlar