Niestandardowa weryfikacja poczty e-mail za pomocą usługi SendGrid

Przed rozpoczęciem użyj selektora Wybierz typ zasad, aby wybrać typ konfigurowanych zasad. Usługa Azure Active Directory B2C oferuje dwie metody definiowania sposobu interakcji użytkowników z aplikacjami: za pomocą wstępnie zdefiniowanych przepływów użytkowników lub w pełni konfigurowalnych zasad niestandardowych. Kroki wymagane w tym artykule są różne dla każdej metody.

Użyj niestandardowej poczty e-mail w usłudze Azure Active Directory B2C (Azure AD B2C), aby wysłać niestandardową wiadomość e-mail do użytkowników, którzy zarejestrują się w celu korzystania z aplikacji. Korzystając z dostawcy poczty e-mail innej firmy SendGrid, możesz użyć własnego szablonu poczty e-mail i od: adresu i tematu, a także obsługiwać lokalizację i niestandardowe ustawienia jednorazowego hasła (OTP).

Ta funkcja jest dostępna tylko dla zasad niestandardowych. Aby uzyskać instrukcje konfiguracji, wybierz pozycję Zasady niestandardowe w poprzednim selektorze.

Niestandardowa weryfikacja poczty e-mail wymaga użycia dostawcy poczty e-mail innej firmy, takiego jak SendGrid, Mailjet lub SparkPost, niestandardowy interfejs API REST lub dowolny dostawca poczty e-mail oparty na protokole HTTP (w tym własny). W tym artykule opisano konfigurowanie rozwiązania korzystającego z usługi SendGrid.

Tworzenie konta usługi SendGrid

Jeśli jeszcze go nie masz, zacznij od skonfigurowania konta usługi SendGrid. Aby uzyskać instrukcje dotyczące konfiguracji, zobacz sekcję Tworzenie konta usługi SendGrid w temacie Jak wysyłać wiadomości e-mail przy użyciu usługi SendGrid z platformą Azure.

Upewnij się, że ukończono sekcję, w której utworzono klucz interfejsu API usługi SendGrid. Zarejestruj klucz interfejsu API do użycia w późniejszym kroku.

Ważne

Usługa SendGrid oferuje klientom możliwość wysyłania wiadomości e-mail z udostępnionych adresów IP i dedykowanych adresów IP. W przypadku korzystania z dedykowanych adresów IP należy prawidłowo utworzyć własną reputację przy użyciu rozgrzewki adresu IP. Aby uzyskać więcej informacji, zobacz Rozgrzewanie adresu IP.

Tworzenie klucza zasad usługi Azure AD B2C

Następnie zapisz klucz interfejsu API usługi SendGrid w kluczu zasad usługi Azure AD B2C, aby odwoływać się do zasad.

  1. Zaloguj się w witrynie Azure Portal.
  2. Jeśli masz dostęp do wielu dzierżaw, wybierz ikonę Ustawienia w górnym menu, aby przełączyć się do dzierżawy usługi Azure AD B2C z menu Katalogi i subskrypcje.
  3. W lewym górnym rogu witryny Azure Portal wybierz pozycję Wszystkie usługi, a następnie wyszukaj i wybierz pozycję Azure AD B2C.
  4. Na stronie Przegląd wybierz pozycję Identity Experience Framework.
  5. Wybierz pozycję Klucze zasad, a następnie wybierz pozycję Dodaj.
  6. W obszarze Opcje wybierz pozycję Ręczne.
  7. Wprowadź nazwę klucza zasad. Na przykład SendGridSecret. Prefiks B2C_1A_ jest dodawany automatycznie do nazwy klucza.
  8. W obszarze Wpis tajny wprowadź wcześniej zarejestrowany klucz interfejsu API usługi SendGrid.
  9. W obszarze Użycie klucza wybierz pozycję Podpis.
  10. Wybierz pozycję Utwórz.

Tworzenie szablonu usługi SendGrid

Za pomocą utworzonego konta usługi SendGrid i klucza interfejsu API Usługi SendGrid przechowywanego w kluczu zasad usługi Azure AD B2C utwórz dynamiczny szablon transakcyjny usługi SendGrid.

  1. W witrynie SendGrid otwórz stronę szablonów transakcyjnych i wybierz pozycję Utwórz szablon dynamiczny.

  2. Wprowadź unikatową nazwę szablonu, taką jak Verification email , a następnie wybierz pozycję Utwórz.

  3. Aby rozpocząć edytowanie nowego szablonu, wybierz szablon , Verification emaila następnie wybierz pozycję Dodaj wersję.

  4. Wybierz pozycję Pusty szablon , a następnie Edytor kodu.

  5. W edytorze HTML wklej poniższy szablon HTML lub użyj własnego szablonu. Parametry {{otp}} i {{email}} są zastępowane dynamicznie wartością hasła jednorazowego i adresem e-mail użytkownika.

    <!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. Rozwiń menu Ustawienia, a w polu Nazwa wersji wprowadź wersję szablonu.

  7. W polu Temat wprowadź wartość {{subject}}.

  8. Wybierz pozycję Zapisz.

  9. Wróć do strony Szablony transakcyjne, wybierając strzałkę wstecz.

  10. Zarejestruj identyfikator szablonu utworzonego do użycia w późniejszym kroku. Na przykład d-989077fbba9746e89f3f6411f596fb96. Ten identyfikator należy określić podczas dodawania przekształcenia oświadczeń.

Ważne

W następnych krokach pokazano, jak utworzyć niestandardowe pliki XML zasad. Zalecamy użycie przykładowych niestandardowych zasad weryfikacji niestandardowej niestandardowej weryfikacji poczty e-mail dostępnych w witrynie GitHub. DisplayControl_TrustFrameworkExtensions.xmlużywa TrustFrameworkExtensions.xml jako pliku podstawowego, dlatego upewnij się, że w zasadach dołącz TrustFrameworkBase.xmlpliki TrustFrameworkLocalization.xml i z TrustFrameworkExtensions.xml pakietu startowego SocialAndLocalAccounts.

Dodawanie typów oświadczeń usługi Azure AD B2C

W zasadach dodaj następujące typy oświadczeń do <ClaimsSchema> elementu w programie <BuildingBlocks>.

Te typy oświadczeń są niezbędne do wygenerowania i zweryfikowania adresu e-mail przy użyciu jednorazowego kodu hasła (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> -->

Dodawanie przekształcenia oświadczeń

Następnie potrzebne jest przekształcenie oświadczeń w celu wyprowadzenia oświadczenia ciągu JSON, które tworzy treść żądania wysłanego do usługi SendGrid.

Struktura obiektu JSON jest definiowana przez identyfikatory w notacji kropkowej parametrów InputParameters i TransformationClaimTypes elementu InputClaims. Liczby w notacji kropkowej oznaczają tablice. Wartości pochodzą z wartości InputClaims i właściwości InputParameters "Value". Aby uzyskać więcej informacji na temat przekształceń oświadczeń JSON, zobacz Przekształcenia oświadczeń JSON.

Dodaj następujące przekształcenie oświadczeń do <ClaimsTransformations> elementu w programie <BuildingBlocks>. Wprowadź następujące aktualizacje w pliku XML przekształcania oświadczeń:

  • template_id Zaktualizuj wartość InputParameter przy użyciu identyfikatora szablonu transakcyjnego SendGrid utworzonego wcześniej w szablonie Create SendGrid (Utwórz usługę SendGrid).
  • from.email Zaktualizuj wartość adresu. Użyj prawidłowego adresu e-mail, aby zapobiec oznaczeniu weryfikacyjnej wiadomości e-mail jako spamu.

    Uwaga

    Ten adres e-mail należy zweryfikować w usłudze SendGrid w obszarze Uwierzytelnianie nadawcy przy użyciu uwierzytelniania domeny lub uwierzytelniania pojedynczego nadawcy.

  • Zaktualizuj wartość parametru wejściowego wiersza tematu personalizations.0.dynamic_template_data.subject przy użyciu wiersza tematu odpowiedniego dla twojej organizacji.
<!-- 
<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> -->

Dodawanie definicji zawartości identyfikatora DataUri

Poniżej przekształceń oświadczeń w programie <BuildingBlocks>dodaj następujący element ContentDefinition , aby odwołać się do identyfikatora URI danych w wersji 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> -->

Tworzenie kontrolek wyświetlania

Kontrolka wyświetlania weryfikacji służy do weryfikowania adresu e-mail przy użyciu kodu weryfikacyjnego, który otrzymuje użytkownik.

Ta przykładowa kontrolka wyświetlania jest skonfigurowana do:

  1. email Zbierz typ oświadczenia adresu od użytkownika.

  2. Korzystając z akcji, wygeneruj SendCode kod OTP i wyślij wiadomość e-mail z kodem OTP do użytkownika.

    Send verification code email action

  3. Poczekaj, aż użytkownik podać verificationCode typ oświadczenia z kodem wysłanym do użytkownika.

  4. email Wróć do samodzielnego profilu technicznego, który zawiera odwołanie do tej kontrolki wyświetlania.

W obszarze definicje zawartości w obszarze <BuildingBlocks>dodaj następujący element DisplayControl typu VerificationControl do zasad.

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

Dodawanie profilów technicznych OTP

Profil GenerateOtp techniczny generuje kod dla adresu e-mail. Profil VerifyOtp techniczny weryfikuje kod skojarzony z adresem e-mail. Możesz zmienić konfigurację formatu i wygaśnięcia jednorazowego hasła. Aby uzyskać więcej informacji na temat profilów technicznych OTP, zobacz Definiowanie jednorazowego profilu technicznego hasła.

Uwaga

Kody OTP generowane przez protokół Web.TPEngine.Providers.OneTimePasswordProtocolProvider są powiązane z sesją przeglądarki. Oznacza to, że użytkownik może wygenerować unikatowe kody OTP w różnych sesjach przeglądarki, które są prawidłowe dla odpowiednich sesji. Natomiast kod OTP generowany przez wbudowanego dostawcę poczty e-mail jest niezależny od sesji przeglądarki, więc jeśli użytkownik wygeneruje nowy kod OTP w nowej sesji przeglądarki, zastępuje poprzedni kod OTP.

Dodaj następujące profile techniczne do <ClaimsProviders> elementu .

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

Dodawanie profilu technicznego interfejsu API REST

Ten profil techniczny interfejsu API REST generuje zawartość wiadomości e-mail (przy użyciu formatu SendGrid). Aby uzyskać więcej informacji na temat profilów technicznych RESTful, zobacz Definiowanie profilu technicznego RESTful.

Podobnie jak w przypadku profilów technicznych OTP, dodaj następujące profile techniczne do <ClaimsProviders> elementu .

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

Tworzenie odwołania do kontrolek wyświetlania

W ostatnim kroku dodaj odwołanie do utworzonego kontrolki DisplayControl. Zastąp istniejące LocalAccountSignUpWithLogonEmail i LocalAccountDiscoveryUsingEmailAddress samodzielne profile techniczne skonfigurowane w zasadach podstawowych następującym fragmentem kodu XML. Jeśli użyto starszej wersji zasad usługi Azure AD B2C, te profile techniczne są używane DisplayClaims z odwołaniem do .DisplayControl

Aby uzyskać więcej informacji, zobacz Samodzielny profil techniczny i 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>

[Opcjonalnie] Lokalizowanie wiadomości e-mail

Aby zlokalizować wiadomość e-mail, musisz wysłać zlokalizowane ciągi do usługi SendGrid lub dostawcy poczty e-mail. Możesz na przykład zlokalizować temat wiadomości e-mail, treść, wiadomość kodowa lub podpis wiadomości e-mail. W tym celu można użyć przekształcenia oświadczeń GetLocalizedStringsTransformation , aby skopiować zlokalizowane ciągi do typów oświadczeń. Przekształcenie GenerateEmailRequestBody oświadczeń, które generuje ładunek JSON, używa oświadczeń wejściowych zawierających zlokalizowane ciągi.

  1. W zasadach zdefiniuj następujące oświadczenia ciągów: temat, komunikat, kodIntro i podpis.

  2. Zdefiniuj przekształcenie oświadczeń GetLocalizedStringsTransformation w celu zastąpienia zlokalizowanych wartości ciągów do oświadczeń z kroku 1.

  3. Zmień przekształcenie oświadczeń, GenerateEmailRequestBody aby używać oświadczeń wejściowych przy użyciu następującego fragmentu kodu XML.

  4. Zaktualizuj szablon usługi SendGrid, aby używał parametrów dynamicznych zamiast wszystkich ciągów zlokalizowanych w usłudze Azure AD B2C.

    <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. Dodaj następujący element Lokalizacja .

    <!--
    <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. Dodaj odwołania do elementów LocalizedResources, aktualizując element 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. Na koniec dodaj następujące przekształcenia oświadczeń wejściowych do LocalAccountSignUpWithLogonEmail profilów technicznych i .LocalAccountDiscoveryUsingEmailAddress

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

[Opcjonalnie] Lokalizowanie interfejsu użytkownika

Element Lokalizacja umożliwia obsługę wielu ustawień regionalnych lub języków w zasadach dotyczących podróży użytkownika. Obsługa lokalizacji w zasadach umożliwia udostępnianie ciągów specyficznych dla języka zarówno dla elementów interfejsu użytkownika kontrolki wyświetlania weryfikacji, jak i jednorazowych komunikatów o błędach hasła. Dodaj następujący localizedString do lokalizacjiLokalizowaneResources.

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

Następne kroki