مشاركة عبر


التحقق من البريد الإلكتروني المخصص باستخدام Mailjet

قبل أن تبدأ استخدم اختر نوع النهجالمحدد لاختيار نوع النهج التي تقوم بإعدادها. يوفر Azure Active Directory B2C طريقتين لتحديد كيفية تفاعل المستخدمين مع تطبيقاتك: من خلال تدفقات محددة مسبقا للمستخدمين أو من خلال سياسات مخصصة قابلة للتكوين بشكل كامل. تختلف الخطوات المطلوبة في هذه المقالة لكل أسلوب.

استخدم البريد الإلكتروني المخصص في Azure Active Directory B2C (Azure AD B2C) لإرسال بريد إلكتروني مخصص للمستخدمين الذين يسجلون لاستخدام تطبيقاتك. باستخدام مزود البريد الإلكتروني الخاص بجهة خارجية Mailjet، يمكنك استخدام قالب البريد الإلكتروني الخاص بك من: العنوان والموضوع، بالإضافة إلى دعم الترجمة وإعدادات كلمة المرور المخصصة لمرة واحدة (OTP).

هذه الميزة متاحة فقط للسياسات المخصصة. لخطوات الإعداد، حدد نهج مخصص في المحدد السابق.

يتطلب التحقق من البريد الإلكتروني المخصص استخدام مزود بريد إلكتروني تابع لجهة خارجية مثل Mailjet أو SendGrid أو SparkPost، أو واجهة برمجة تطبيقات REST مخصصة أو أي مزود بريد إلكتروني يستند إلى HTTP (بما في ذلك مزود البريد الإلكتروني الخاص بك). توضح هذه المقالة إعداد حل يستخدم Mailjet.

إنشاء حساب Mailjet

إذا لم يكن لديك حساب بالفعل، ابدأ بإعداد حساب Mailjet (يمكن لعملاء Azure إلغاء تأمين 6000 رسالة بريد إلكتروني بحد أقصى 200 رسالة بريد إلكتروني في اليوم).

  1. اتبع إرشادات الإعداد في إنشاء حساب Mailjet.
  2. لكي تتمكن من إرسال البريد الإلكتروني، سجل عنوان البريد الإلكتروني للمرسِل أو نطاقه وتحقق من صحته.
  3. انتقل إلى صفحة إدارة مفتاح واجهة برمجة التطبيقات. سجل مفتاح واجهة برمجة التطبيقات ومفتاح سري للاستخدام في خطوة لاحقة. يتم إنشاء كلا المفتاحين تلقائيًا عند إنشاء حسابك.

هام

توفر Mailjet للعملاء القدرة على إرسال رسائل البريد الإلكتروني من IP المشترك وعناوين IP المخصصة. عند استخدام عناوين IP مخصصة، فأنت بحاجة إلى بناء سمعتك الخاصة بشكل صحيح من خلال إحماء عنوان IP. لمزيد من المعلومات، راجع كيف أقوم بإحماء IP الخاص بي؟

قم بإنشاء مفتاح نهج Microsoft Azure Active Directory B2C

بعد ذلك، قم بتخزين مفتاح API Mailjet في مفتاح نهج Azure AD B2C للسياسات الخاصة بك إلى مرجع.

  1. سجل الدخول إلى مدخل Azure.
  2. إذا كان لديك حق الوصول إلى عدة مستأجرين، فحدد رمز الإعدادات في القائمة العلوية للتبديل إلى مستأجر Azure AD B2C من قائمة Directories + subscriptions.
  3. اختر كل الخدمات في الزاوية العلويةِ اليسرى من مدخل Microsoft Azure، ثم ابحث عن Azure AD B2Cوحدده.
  4. في صفحة النظرة العامة، ضمن السياسات، حدد إطار عمل تجربة الهوية.
  5. حدد مفاتيح النهج ثم حدد إضافة.
  6. بالنسبة إلىالخيارات، اختريدوي.
  7. أدخِل اسمًا لمفتاح النهج. على سبيل المثال، MailjetApiKey. تتم إضافة البادئة B2C_1A_ تلقائيًا إلى اسم مفتاحك.
  8. في البيانات السرية، أدخِل مفتاح API Mailjet الذي سجلته سابقًا.
  9. لاستخدام المفتاح ، حدد التوقيع .
  10. حدد إنشاء.
  11. حدد Policy Keys ثم حدد Add.
  12. بالنسبة إلىالخيارات، اختريدوي.
  13. أدخِل اسمًا لمفتاح النهج. على سبيل المثال، MailjetSecretKey. تتم إضافة البادئة B2C_1A_ تلقائيًا إلى اسم مفتاحك.
  14. في البيانات السرية، أدخِل مفتاح API Mailjet الذي سجلته سابقًا.
  15. لاستخدام المفتاح ، حدد التوقيع .
  16. حدد إنشاء.

إنشاء قالب Mailjet

باستخدام حساب Mailjet الذي تم إنشاؤه ومفتاح API Mailjet المخزن في مفتاح نهج B2C AD Azure، قم بإنشاء قالب معاملات ديناميكي في Mailjet.

  1. في موقع Mailjet، افتح صفحة قوالب المعاملات وحدد إنشاء قالب جديد.

  2. حدد عن طريق ترميزه في HTML، ثم حدد الرمز من الصفر.

  3. أدخِل اسم قالب فريد مثل Verification email، ثم حدد إنشاء.

  4. في محرر HTML، الصق قالب HTML التالي أو استخدم قالب HTML الخاص بك. سيتم استبدال المعلمات{{var:otp:""}} والمعلمات{{var:email:""}} ديناميكيًا بقيمة كلمة المرور لمرة واحدة وعنوان البريد الإلكتروني للمستخدم.

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

    1. بالنسبة إلى الموضوع، أدخِل قيمة افتراضية للموضوع. يستخدم Mailjet هذه القيمة عندما لا تحتوي API على معلمة موضوع.
    2. بالنسبة إلى الاسم، اكتب اسم الشركة.
    3. بالنسبة إلى العنوان، حدد عنوان بريدك الإلكتروني
    4. حدد حفظ.
  6. من أعلى اليمين، حدد Save & Publish، ثم حدد Yes, publish changes

  7. قم بتسجيل معرف القالب الذي أنشأته لاستخدامه في خطوة لاحقة. يمكنك تحديد هذا المعرف عند إضافة تحويل المطالبات.

هام

توضح لك الخطوات التالية كيفية إنشاء ملفات XML للنهج المخصصة. نوصي باستخدام نهج مخصصة نموذج للتحقق من البريد الإلكتروني المخصص المتوفرة على GitHub. DisplayControl_TrustFrameworkExtensions.xml يستخدم TrustFrameworkExtensions.xmlباعتباره الملف الأساسي خاصته ومن ثم التأكد من تضمين الملفات TrustFrameworkBase.xml، TrustFrameworkLocalization.xml و TrustFrameworkExtensions.xmlمن حزمة البدء SocialAndLocalAccountsفينهجك.

أضف أنواع مطالبة Microsoft Azure Active Directory B2C

في وثيقتك، أضف أنواع المطالبات التالية إلى <ClaimsSchema>العنصر الموجود بداخلها<BuildingBlocks>.

تعد أنواع المطالبات هذه ضرورية لإنشاء عنوان البريد الإلكتروني والتحقق منه باستخدام رمز كلمة المرور لمرة واحدة (OTP).

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

إضافة تحويل المطالبات

بعد ذلك، تحتاج إلى تحويل مطالبات لإخراج مطالبة سلسلة JSON التي ستكون نص الطلب المرسل إلى Mailjet.

يتم تعريف بنية كائن JSON عن طريق المعرفات في تدوين نقطة من معلمات الإدخال وأنواع مطالبات التحويلات في مطالبات الإدخال. تتضمن الأرقام في رمز النقطة المصفوفات. تأتي القيم من قيم مطالبات الإدخال وخصائص "القيمة" معلمات الإدخال. لمزيد من المعلومات حول تحويلات مطالبات JSON، راجع تحويلات مطالبات JSON.

أضف تحويل المطالبات التالي إلى <ClaimsTransformations>العنصر الموجود بداخله<BuildingBlocks>. قم بإجراء التحديثات التالية على XML الخاص بتحويل المطالبات:

  • تحديث Messages.0.TemplateID قيمة معلمة الإدخال مع معرف قالب المعاملات Mailjet الذي قمت بإنشائه سابقًا في إنشاء قالب Mailjet.
  • قم بتحديث Messages.0.From.Email قيمة العنوان. استخدم عنوان بريد إلكتروني صالحًا للمساعدة في منع رسالة التحقق من وضع علامة عليها كرسائل غير مرغوب فيها.
  • قم بتحديث قيمة Messages.0.Subjectمعلمة إدخال سطر الموضوع بسطر موضوع مناسب لمؤسستك.
<!-- 
<BuildingBlocks>
  <ClaimsTransformations> -->
    <ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.To.0.Email" />
        <InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="Messages.0.Variables.otp" />
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.Variables.email" />
      </InputClaims>
      <InputParameters>
        <!-- Update the template_id value with the ID of your Mailjet template. -->
        <InputParameter Id="Messages.0.TemplateID" DataType="int" Value="1234567"/>
        <InputParameter Id="Messages.0.TemplateLanguage" DataType="boolean" Value="true"/>

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

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

أضف تعريف لمحتوى DataUri

أسفل تحويلات المطالبات داخل<BuildingBlocks>، أضف ContentDefinition التالي للإشارة إلى URI لبيانات الإصدار 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> -->

قم بإنشاء DisplayControl

يتم استخدام عنصر تحكم في عرض التحقق للتحقق من عنوان البريد الإلكتروني باستخدام رمز التحقق الذي تم إرساله إلى المستخدم.

تم تكوين عنصر التحكم في العرض هذا من أجل:

  1. اجمع email نوع مطالبة العنوان من المستخدم.

  2. باستخدام SendCodeهذا الإجراء، أنشئ رمز OTP وأرسل بريدًا إلكترونيًا يحتوي على رمز OTP إلى المستخدم.

    Send verification code email action

  3. انتظر حتى يقدم المستخدم verificationCodeنوع المطالبة مع الرمز المرسل إلى المستخدم.

  4. إرجاع email إلى الملف التقني المؤكد ذاتيًا والذي يحتوي على مرجع إلى عرض عنصر التحكم هذا.

ضمن تعريفات المحتوى، لا يزال داخل<BuildingBlocks>، أضف DisplayControl التالي من نوع VerificationControl إلى النهج الخاص بك.

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

ينشئ GenerateOtp ملف التعريف الفني رمزًا لعنوان البريد الإلكتروني. يتحقق VerifyOtp الملف الشخصي الفني من الرمز المرتبط بعنوان البريد الإلكتروني. يمكنك تغيير تكوين التنسيق وانتهاء صلاحية كلمة المرور لمرة واحدة. لمزيد من المعلومات حول ملفات التعريف الفنية لمرة واحدة، راجع تحديد ملف تعريف تقني لكلمة المرور لمرة واحدة.

إشعار

رموز OTP التي تم إنشاؤها بواسطة بروتوكول Web.TPEngine.Providers.OneTimePasswordProtocolProvider مرتبطة بجلسة المتصفح. هذا يعني أنه يمكن للمستخدم إنشاء رموز OTP فريدة في جلسات المتصفح المختلفة التي تكون كل منها صالحة لجلساتها المقابلة. على النقيض من ذلك، فإن رمز OTP الذي تم إنشاؤه بواسطة مزود البريد الإلكتروني المدمج مستقل عن جلسة المتصفح، لذلك إذا قام المستخدم بإنشاء رمز OTP جديد في جلسة متصفح جديدة، فإنه يحل محل رمز OTP السابق.

أضف الملفات الفنية التالية إلى <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> -->

إضافة ملف تعريف تقني لواجهة برمجة تطبيقات REST

يقوم ملف التعريف REST API التقني بإنشاء محتوى البريد الإلكتروني (باستخدام تنسيق Mailjet). لمزيد من المعلومات حول ملفات التعريف RESTful التقنية، راجع تعريف ملف تعريف RESTful تقني.

كما هو الحال مع ملفات تعريف OTP الفنية، أضف الملفات الفنية التالية إلى <ClaimsProviders> العنصر.

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

قم بعمل مرجع إلى DisplayControl

في الخطوة الأخيرة، أضف مرجعًا إلى DisplayControl الذي قمت بإنشائه. تجاوز ملفات التعريف التقنية LocalAccountSignUpWithLogonEmail و LocalAccountDiscoveryUsingEmailAddressالموجودة والمؤكدة ذاتيًا والتي تم تكوينها في السياسة الأساسية باستخدام قصاصة XML البرمجية التالية. إذا كنت تستخدم إصداراً سابقاً من نهج Microsoft Azure Active Directory B2C، فإن ملفات التعريف الفنية هذه تستخدم DisplayClaims مع الإشارة إلى 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>

[اختياري] ترجمة بريدك الإلكتروني

لترجمة البريد الإلكتروني، يجب إرسال سلاسل مترجمة إلى Mailjet، أو موفر البريد الإلكتروني الخاص بك. على سبيل المثال، يمكنك ترجمة موضوع البريد الإلكتروني أو النص الأساسي أو رسالة التعليمات البرمجية أو توقيع البريد الإلكتروني. للقيام بذلك، يمكنك استخدام تحويل مطالبات GetLocalizedString Transformation لنسخ السلاسل المترجمة إلى أنواع المطالبات. يستخدم GenerateEmailRequestBody تحويل المطالبات، الذي ينشئ حمولة JSON، مطالبات الإدخال التي تحتوي على السلاسل المترجمة.

  1. في سياستك، حدد مطالبات السلسلة التالية: الموضوع والرسالة و codeIntro والتوقيع.

  2. حدد تحويل مطالبات GetLocalizedStringsTransformation لاستبدال قيم السلسلة المترجمة في المطالبات من الخطوة 1.

  3. قم بتغييرGenerateEmailRequestBody تحويل المطالبات لاستخدام مطالبات الإدخال مع مقتطف XML التالي.

  4. قم بتحديث قالب Mailjet لاستخدام معلمات الديناميكية بدلاً من كافة السلاسل التي سيتم ترجمة عن طريق B2C AD Azure.

    <ClaimsTransformation Id="GetLocalizedStringsForEmail" TransformationMethod="GetLocalizedStringsTransformation">
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="subject" TransformationClaimType="email_subject" />
        <OutputClaim ClaimTypeReferenceId="message" TransformationClaimType="email_message" />
        <OutputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="email_code" />
        <OutputClaim ClaimTypeReferenceId="signature" TransformationClaimType="email_signature" />
      </OutputClaims>
    </ClaimsTransformation>
    <ClaimsTransformation Id="GenerateEmailRequestBody" TransformationMethod="GenerateJson">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.To.0.Email" />
        <InputClaim ClaimTypeReferenceId="subject" TransformationClaimType="Messages.0.Subject" />
        <InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="Messages.0.Variables.otp" />
        <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="Messages.0.Variables.email" />
        <InputClaim ClaimTypeReferenceId="message" TransformationClaimType="Messages.0.Variables.otpmessage" />
        <InputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="Messages.0.Variables.otpcodeIntro" />
        <InputClaim ClaimTypeReferenceId="signature" TransformationClaimType="Messages.0.Variables.otpsignature" />
      </InputClaims>
      <InputParameters>
        <!-- Update the template_id value with the ID of your Mailjet template. -->
        <InputParameter Id="Messages.0.TemplateID" DataType="int" Value="1234567"/>
        <InputParameter Id="Messages.0.TemplateLanguage" DataType="boolean" Value="true"/>
    
        <!-- Update with an email appropriate for your organization. -->
        <InputParameter Id="Messages.0.From.Email" DataType="string" Value="my_email@mydomain.com"/>
      </InputParameters>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="emailRequestBody" TransformationClaimType="outputClaim"/>
      </OutputClaims>
    </ClaimsTransformation>
    
  5. أضف عنصر الترجمة التالي.

    <!--
    <BuildingBlocks> -->
      <Localization Enabled="true">
        <SupportedLanguages DefaultLanguage="en" MergeBehavior="ReplaceAll">
          <SupportedLanguage>en</SupportedLanguage>
          <SupportedLanguage>es</SupportedLanguage>
        </SupportedLanguages>
        <LocalizedResources Id="api.custom-email.en">
          <LocalizedStrings>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_subject">Contoso account email verification code</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_message">Thanks for validating the account</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_code">Your code is</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_signature">Sincerely</LocalizedString>
          </LocalizedStrings>
        </LocalizedResources>
        <LocalizedResources Id="api.custom-email.es">
          <LocalizedStrings>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_subject">Código de verificación del correo electrónico de la cuenta de Contoso</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_message">Gracias por comprobar la cuenta de </LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_code">Su código es</LocalizedString>
            <LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_signature">Sinceramente</LocalizedString>
          </LocalizedStrings>
        </LocalizedResources>
      </Localization>
    <!--
    </BuildingBlocks> -->
    
  6. أضف مراجع إلى عناصر LocalizedResources عن طريق تحديث عنصرContentDefinitions.

    <!--
    <BuildingBlocks> -->
      <ContentDefinitions>
        <ContentDefinition Id="api.localaccountsignup">
          <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.2</DataUri>
          <LocalizedResourcesReferences MergeBehavior="Prepend">
            <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.custom-email.en" />
            <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.custom-email.es" />
          </LocalizedResourcesReferences>
        </ContentDefinition>
        <ContentDefinition Id="api.localaccountpasswordreset">
          <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.2</DataUri>
          <LocalizedResourcesReferences MergeBehavior="Prepend">
            <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.custom-email.en" />
            <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.custom-email.es" />
          </LocalizedResourcesReferences>
        </ContentDefinition>
      </ContentDefinitions>
    <!--
    </BuildingBlocks> -->
    
  7. أخيرًا، أضف تحويل مطالبات المدخلات التالية إلى LocalAccountSignUpWithLogonEmailالملفات الشخصية وLocalAccountDiscoveryUsingEmailAddressالتقنية.

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

[اختياري] قم بترجمة واجهة المستخدم

يسمح لك عنصر الترجمةبدعم لغات أو لغات متعددة في نهج رحلات المستخدم. يتيح لك دعم الترجمة في السياسات توفير سلاسل خاصة باللغة لكل من عناصر واجهة مستخدم التحكم في عرض التحقق ورسائل خطأ كلمة المرور لمرة واحدة. قم بإضافة LocalizedString التالية إلى 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>

الخطوات التالية