SendGrid を使用するカスタム メール確認Custom email verification with SendGrid

Azure Active Directory B2C (Azure AD B2C) でカスタム メールを使用し、自分のアプリケーションに新規登録したユーザーにカスタマイズしたメールを送信します。Use custom email in Azure Active Directory B2C (Azure AD B2C) to send customized email to users that sign up to use your applications. DisplayControls (現在プレビュー段階)、およびサードパーティの電子メール プロバイダーである SendGrid を使用することで、独自の電子メール テンプレートや From: のアドレスと件名を使用できるだけでなく、ローカライズやカスタムのワンタイム パスワード (OTP) 設定をサポートできます。By using DisplayControls (currently in preview) and the third-party email provider SendGrid, you can use your own email template and From: address and subject, as well as support localization and custom one-time password (OTP) settings.

カスタム メール確認では、SendGridMailjet、または SparkPost といったサードパーティの電子メール プロバイダー、カスタム REST API、あるいは任意の HTTP ベースの電子メール プロバイダー (独自のものも含む) を使用する必要があります。Custom email verification requires the use of a third-party email provider like SendGrid, Mailjet, or SparkPost, a custom REST API, or any HTTP-based email provider (including your own). この記事では、SendGrid を使用するソリューションの設定について説明します。This article describes setting up a solution that uses SendGrid.

注意

この機能はパブリック プレビュー段階にあります。This feature is in public preview.

SendGrid アカウントの作成Create a SendGrid account

まだ用意していない場合、まず、SendGrid アカウントを設定してください (Azure のお客様は毎月、25,000 の無料電子メールをロック解除できます)。If you don't already have one, start by setting up a SendGrid account (Azure customers can unlock 25,000 free emails each month). 設定方法については、「SendGrid を使用した Azure での電子メールの送信方法」の「SendGrid アカウントの作成」セクションをご覧ください。For setup instructions, see the Create a SendGrid Account section of How to send email using SendGrid with Azure.

SendGrid API キーを作成するセクションを必ず完了してください。Be sure to complete the section in which you create a SendGrid API key. 後の手順で使用するために、API キーを記録しておきます。Record the API key for use in a later step.

Azure AD B2C ポリシー キーの作成Create Azure AD B2C policy key

次に、SendGrid API キーを Azure AD B2C ポリシー キーに格納し、ポリシーで参照されるようにします。Next, store the SendGrid API key in an Azure AD B2C policy key for your policies to reference.

  1. Azure portal にサインインします。Sign in to the Azure portal.
  2. ご自分の Azure AD B2C テナントが含まれるディレクトリを必ず使用してください。Make sure you're using the directory that contains your Azure AD B2C tenant. 上部のメニューにある [ディレクトリ + サブスクリプション] フィルターを選択し、ご利用の Azure AD B2C ディレクトリを選択します。Select the Directory + subscription filter in the top menu and choose your Azure AD B2C directory.
  3. Azure portal の左上隅にある [すべてのサービス] を選択してから、 [Azure AD B2C] を検索して選択します。Choose All services in the top-left corner of the Azure portal, and then search for and select Azure AD B2C.
  4. [概要] ページで、 [Identity Experience Framework] を選択します。On the Overview page, select Identity Experience Framework.
  5. [ポリシー キー] を選択し、 [追加] を選択します。Select Policy Keys and then select Add.
  6. [オプション] では、 [手動] を選びます。For Options, choose Manual.
  7. ポリシー キーの名前を入力します。Enter a Name for the policy key. たとえば、「 SendGridSecret 」のように入力します。For example, SendGridSecret. プレフィックス B2C_1A_ がキーの名前に自動的に追加されます。The prefix B2C_1A_ is added automatically to the name of your key.
  8. [シークレット] に、前に記録したクライアント シークレットを入力します。In Secret, enter your client secret that you previously recorded.
  9. [キー使用法] には [署名] を選択します。For Key usage, select Signature.
  10. [作成] を選択しますSelect Create.

SendGrid テンプレートを作成するCreate SendGrid template

SendGrid アカウントを作成し、SendGrid API キーを Azure AD B2C ポリシー キーに格納したら、SendGrid 動的トランザクション テンプレートを作成します。With a SendGrid account created and SendGrid API key stored in an Azure AD B2C policy key, create a SendGrid dynamic transactional template.

  1. SendGrid サイトで [transactional templates](トランザクション テンプレート) ページを開き、 [テンプレートの作成] を選択します。On the SendGrid site, open the transactional templates page and select Create Template.

  2. Verification email」のような一意のテンプレート名を入力し、 [保存] を選択します。Enter a unique template name like Verification email and then select Save.

  3. 新しいテンプレートの編集を開始するには、 [バージョンの追加] を選択します。To begin editing your new template, select Add Version.

  4. [コード エディター] を選択し、 [続行] を選択します。Select Code Editor and then Continue.

  5. HTML エディターに次の HTML テンプレートを貼り付けるか、独自のテンプレートを貼り付けます。In the HTML editor, paste following HTML template or use your own. {{otp}} パラメーターと {{email}} パラメーターは、ワンタイム パスワード値とユーザー電子メール アドレスで動的に置換されます。The {{otp}} and {{email}} parameters will be replaced dynamically with the one-time password value and the user email address.

    <!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>
    <img src="https://mucp.api.account.microsoft.com/m/v2/v?d=AIAACWEPFYXYIUTJIJVV4ST7XLBHVI5MLLYBKJAVXHBDTBHUM5VBSVVPTTVRWDFIXJ5JQTHYOH5TUYIPO4ZAFRFK52UAMIS3UNIPPI7ZJNDZPRXD5VEJBN4H6RO3SPTBS6AJEEAJOUYL4APQX5RJUJOWGPKUABY&amp;i=AIAACL23GD2PFRFEY5YVM2XQLM5YYWMHFDZOCDXUI2B4LM7ETZQO473CVF22PT6WPGR5IIE6TCS6VGEKO5OZIONJWCDMRKWQQVNP5VBYAINF3S7STKYOVDJ4JF2XEW4QQVNHMAPQNHFV3KMR3V3BA4I36B6BO7L4VQUHQOI64EOWPLMG5RB3SIMEDEHPILXTF73ZYD3JT6MYOLAZJG7PJJCAXCZCQOEFVH5VCW2KBQOKRYISWQLRWAT7IINZ3EFGQI2CY2EMK3FQOXM7UI3R7CZ6D73IKDI" width="1" height="1"></body>
    </html>
    
  6. 左側にある [設定] を展開し、 [メールの件名] に「{{subject}}」と入力します。Expand Settings on the left, and for Email Subject, enter {{subject}}.

  7. [テンプレートの保存] を選択します。Select Save Template.

  8. [Transactional Templates](トランザクション テンプレート) に戻るには、戻る矢印を選択します。Return to the Transactional Templates page by selecting the back arrow.

  9. 後の手順で使用するために、作成したテンプレートの ID を記録します。Record the ID of template you created for use in a later step. たとえば、「 d-989077fbba9746e89f3f6411f596fb96 」のように入力します。For example, d-989077fbba9746e89f3f6411f596fb96. 要求変換を追加するときにこの ID を指定します。You specify this ID when you add the claims transformation.

Azure AD B2C の要求の種類を追加するAdd Azure AD B2C claim types

ポリシーで、<BuildingBlocks> 内の <ClaimsSchema> 要素に次の要求の種類を追加します。In your policy, add the following claim types to the <ClaimsSchema> element within <BuildingBlocks>.

これらの要求の種類は、ワンタイム パスワード (OTP) コードを利用してメール アドレスを生成し、検証するために必要です。These claims types are necessary to generate and verify the email address using a one-time password (OTP) code.

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

要求変換の追加Add the claims transformation

次に、SendGrid に送信される要求の本文となる JSON 文字列要求を出力する要求変換が必要になります。Next, you need a claims transformation to output a JSON string claim that will be the body of the request sent to SendGrid.

JSON オブジェクトの構造は、InputClaims の InputParameters と TransformationClaimTypes というドット表記で ID により定義されます。The JSON object's structure is defined by the IDs in dot notation of the InputParameters and the TransformationClaimTypes of the InputClaims. ドット表記の数値は配列を意味します。Numbers in the dot notation imply arrays. 値は、InputClaims の値と InputParameters の "Value" プロパティから取得されます。The values come from the InputClaims' values and the InputParameters' "Value" properties. JSON 要求変換の詳細については、「JSON 要求変換」を参照してください。For more information about JSON claims transformations, see JSON claims transformations.

次の要求変換を <BuildingBlocks> 内の <ClaimsTransformations> 要素に追加します。Add the following claims transformation to the <ClaimsTransformations> element within <BuildingBlocks>. 要求変換 XML を次のように更新します。Make the following updates to the claims transformation XML:

  • SendGrid テンプレートの作成」で先に作成した SendGrid トランザクション テンプレートの ID で template_id InputParameter 値を更新します。Update the template_id InputParameter value with the ID of the SendGrid transactional template you created earlier in Create SendGrid template.
  • from.email アドレス値を更新します。Update the from.email address value. 確認メールがスパムに指定されないように有効なメール アドレスを使用します。Use a valid email address to help prevent the verification email from being marked as spam.
  • personalizations.0.dynamic_template_data.subject 件名入力パラメーターの値を組織に適切な件名で更新します。Update the value of the personalizations.0.dynamic_template_data.subject subject line input parameter with a subject line appropriate for your organization.
<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>

DataUri コンテンツ定義の追加Add DataUri content definition

<BuildingBlocks> 内の要求変換の下で、バージョン 2.0.0 データ URI を参照するように次の ContentDefinition を追加します。Below the claims transformations within <BuildingBlocks>, add the following ContentDefinition to reference the version 2.0.0 data URI:

<ContentDefinitions>
 <ContentDefinition Id="api.localaccountsignup">
    <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.0.0</DataUri>
  </ContentDefinition>
  <ContentDefinition Id="api.localaccountpasswordreset">
    <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.0.0</DataUri>
  </ContentDefinition>
</ContentDefinitions>

DisplayControl の作成Create a DisplayControl

ユーザーに送信される確認コードでメール アドレスを検証する目的で確認の表示制御が使用されます。A verification display control is used to verify the email address with a verification code that's sent to the user.

この例の表示制御には次の動作が設定されています。This example display control is configured to:

  1. ユーザーからアドレス要求の種類 email を収集します。Collect the email address claim type from the user.
  2. ユーザーが自分に送信されたコードを要求の種類 verificationCode に与えるまで待機します。Wait for the user to provide the verificationCode claim type with the code sent to the user.
  3. この表示制御を参照するセルフアサート技術プロファイルに email を戻します。Return the email back to the self-asserted technical profile that has a reference to this display control.
  4. SendCode アクションを利用し、OTP コードを生成し、その OTP コードが含まれるメールをユーザーに送信します。Using the SendCode action, generate an OTP code and send an email with the OTP code to the user.

確認コード メールの送信アクション

引き続きコンテンツ定義の下の <BuildingBlocks> 内で、種類が VerificationControl の次の DisplayControl をポリシーに追加します。Under content definitions, still within <BuildingBlocks>, add the following DisplayControl of type VerificationControl to your policy.

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

OTP 技術プロファイルの追加Add OTP technical profiles

GenerateOtp 技術プロファイルによってメール アドレスのコードが生成されます。The GenerateOtp technical profile generates a code for the email address. VerifyOtp 技術プロファイルによって、メール アドレスに関連付けられているコードが検証されます。The VerifyOtp technical profile verifies the code associated with the email address. ワンタイム パスワードの形式と有効期間の構成を変更できます。You can change the configuration of the format and the expiration of the one-time password. OTP 技術プロファイルの詳細については、ワンタイム パスワード技術プロファイルの定義に関するページを参照してください。For more information about OTP technical profiles, see Define a one-time password technical profile.

次の技術プロファイルを <ClaimsProviders> 要素に追加します。Add the following technical profiles to the <ClaimsProviders> element.

<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">1200</Item>
        <Item Key="CodeLength">6</Item>
        <Item Key="CharacterSet">0-9</Item>
        <Item Key="ReuseSameCode">true</Item>
        <Item Key="MaxNumAttempts">5</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>

REST API 技術プロファイルの追加Add a REST API technical profile

この REST API 技術プロファイルによってメール コンテンツが生成されます (SendGrid 形式が使用されます)。This REST API technical profile generates the email content (using the SendGrid format). RESTful 技術プロファイルの詳細については、RESTful 技術プロファイルの定義に関するページを参照してください。For more information about RESTful technical profiles, see Define a RESTful technical profile.

OTP 技術プロファイルの場合と同様に、次の技術プロファイルを <ClaimsProviders> 要素に追加します。As with the OTP technical profiles, add the following technical profiles to the <ClaimsProviders> element.

<ClaimsProvider>
  <DisplayName>RestfulProvider</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="SendOtp">
      <DisplayName>Use SendGrid's email API to send the code the 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 への参照を付けるMake a reference to the DisplayControl

最後の手順では、作成した DisplayControl への参照を追加します。In the final step, add a reference to the DisplayControl you created. 既存の LocalAccountSignUpWithLogonEmailLocalAccountDiscoveryUsingEmailAddress セルフアサート技術プロファイルを次のように置き換えます。Replace your existing LocalAccountSignUpWithLogonEmail and LocalAccountDiscoveryUsingEmailAddress self-asserted technical profiles with the following. 以前のバージョンの Azure AD B2C ポリシーを使用していた場合。If you used an earlier version of Azure AD B2C policy. これらの技術プロファイルでは、DisplayControl を参照する DisplayClaims が使用されます。These technical profiles use DisplayClaims with a reference to the DisplayControl.

詳細については、セルフアサート技術プロファイルに関するページと「DisplayControl」を参照してください。For more information, see Self-asserted technical profile and DisplayControl.

<ClaimsProvider>
  <DisplayName>Local Account</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="LocalAccountSignUpWithLogonEmail">
      <Metadata>
        <!--OTP validation error messages-->
        <Item Key="UserMessageIfSessionDoesNotExist">You have exceed the maximum time allowed.</Item>
        <Item Key="UserMessageIfMaxRetryAttempted">You have exceed the number of retries allowed.</Item>
        <Item Key="UserMessageIfInvalidCode">You have entered the wrong code.</Item>
        <Item Key="UserMessageIfSessionConflict">Cannot verify the code, please try again later.</Item>
      </Metadata>
      <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">
      <Metadata>
        <!--OTP validation error messages-->
        <Item Key="UserMessageIfSessionDoesNotExist">You have exceed the maximum time allowed.</Item>
        <Item Key="UserMessageIfMaxRetryAttempted">You have exceed the number of retries allowed.</Item>
        <Item Key="UserMessageIfInvalidCode">You have entered the wrong code.</Item>
        <Item Key="UserMessageIfSessionConflict">Cannot verify the code, please try again later.</Item>
      </Metadata>
      <DisplayClaims>
        <DisplayClaim DisplayControlReferenceId="emailVerificationControl" />
      </DisplayClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

[オプション] メールをローカライズする[Optional] Localize your email

メールをローカライズするには、ローカライズされた文字列を SendGrid またはご自分のメール プロバイダーに送信する必要があります。To localize the email, you must send localized strings to SendGrid, or your email provider. たとえば、メールの件名、本文、ご自分のコード メッセージ、またはメールの署名をローカライズできます。For example, you can localize the email subject, body, your code message, or signature of the email. これを行うには、GetLocalizedStringsTransformation 要求変換を使用して、ローカライズされた文字列を要求の種類にコピーします。To do so, you can use the GetLocalizedStringsTransformation claims transformation to copy localized strings into claim types. JSON ペイロードを生成する GenerateEmailRequestBody 要求変換では、ローカライズされた文字列を含む入力要求が使用されます。The GenerateEmailRequestBody claims transformation, which generates the JSON payload, uses input claims that contain the localized strings.

  1. ご自分のポリシーでは、subject、message、codeIntro、および signature の文字列要求を定義します。In your policy, define the following string claims: subject, message, codeIntro, and signature.

  2. ローカライズされた文字列値を手順 1 の要求に置き換える GetLocalizedStringsTransformation 要求変換を定義します。Define a GetLocalizedStringsTransformation claims transformation to substitute localized string values into the claims from step 1.

  3. 次の XML スニペットの入力要求を使用するように GenerateEmailRequestBody 要求変換を変更します。Change the GenerateEmailRequestBody claims transformation to use input claims with the following XML snippet.

  4. Azure AD B2C によってローカライズされるすべての文字列の代わりに、動的パラメーターが使用されるように、お使いの SendGrid テンプレートを更新します。Update your SendGrid template to use dynamic parameters in place of all the strings that will be localized by 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. 次の Localization 要素を追加します。Add the following Localization element.

    <Localization Enabled="true">
      <SupportedLanguages DefaultLanguage="en" MergeBehavior="Append">
        <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>
    
  6. ContentDefinitions 要素を更新し、LocalizedResources 要素への参照を追加します。Add references to the LocalizedResources elements by updating the ContentDefinitions element.

    <ContentDefinitions>
      <ContentDefinition Id="api.localaccountsignup">
        <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.0.0</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.0.0</DataUri>
        <LocalizedResourcesReferences MergeBehavior="Prepend">
          <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.custom-email.en" />
          <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.custom-email.es" />
        </LocalizedResourcesReferences>
      </ContentDefinition>
    </ContentDefinitions>
    
  7. 最後に、次の入力要求変換を LocalAccountSignUpWithLogonEmail および LocalAccountDiscoveryUsingEmailAddress 技術プロファイルに追加します。Finally, add following input claims transformation to the LocalAccountSignUpWithLogonEmail and LocalAccountDiscoveryUsingEmailAddress technical profiles.

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

次のステップNext steps

カスタム メール確認ポリシーの例は GitHub で確認できます。You can find an example of a custom email verification policy on GitHub: