Freigeben über


Benutzerdefinierte E-Mail-Überprüfung mit Mailjet

Von Bedeutung

Ab dem 1. Mai 2025 steht Azure AD B2C nicht mehr für neue Kunden zur Verfügung. Weitere Informationen finden Sie in unseren HÄUFIG gestellten Fragen.

Bevor Sie beginnen, verwenden Sie die Auswahl eines Richtlinientyps oben auf dieser Seite, um den Typ der Richtlinie auszuwählen, die Sie einrichten. Azure Active Directory B2C bietet zwei Methoden zum Definieren der Benutzerinteraktion mit Ihren Anwendungen: vordefinierte Benutzerflows oder vollständig konfigurierbare benutzerdefinierte Richtlinien. Die Schritte, die in diesem Artikel erforderlich sind, unterscheiden sich für jede Methode.

Verwenden Sie benutzerdefinierte E-Mails in Azure Active Directory B2C (Azure AD B2C), um angepasste E-Mails an Benutzer zu senden, die sich für die Verwendung Ihrer Anwendungen registrieren. Mithilfe des E-Mailjet-Anbieters eines Drittanbieters können Sie Ihre eigene E-Mail-Vorlage und "Von: Adresse und Betreff" verwenden sowie Lokalisierung und benutzerdefinierte OTP-Einstellungen (Einmaliges Kennwort) unterstützen.

Dieses Feature ist nur für benutzerdefinierte Richtlinien verfügbar. Wählen Sie für Setupschritte im vorherigen Selektor die Option "Benutzerdefinierte Richtlinie " aus.

Für eine benutzerdefinierte E-Mail-Überprüfung ist die Verwendung eines Drittanbieters wie Mailjet, SendGrid oder SparkPost, einer benutzerdefinierten REST-API oder eines HTTP-basierten E-Mail-Anbieters (einschließlich Ihrer eigenen) erforderlich. In diesem Artikel wird das Einrichten einer Lösung beschrieben, die Mailjet verwendet.

Erstellen eines Mailjet-Kontos

Wenn Sie noch kein Konto haben, richten Sie zunächst ein Mailjet-Konto ein (Azure-Kunden können 6.000 E-Mails mit einem Grenzwert von 200 E-Mails/Tag entsperren).

  1. Befolgen Sie die Einrichtungsanweisungen unter "Mailjet-Konto erstellen".
  2. Um E-Mails senden zu können, registrieren und überprüfen Sie Ihre Absender-E-Mail-Adresse oder Domäne.
  3. Navigieren Sie zur Seite "API-Schlüsselverwaltung". Notieren Sie den API-Schlüssel und den geheimen Schlüssel für die Verwendung in einem späteren Schritt. Beide Schlüssel werden automatisch generiert, wenn Ihr Konto erstellt wird.

Von Bedeutung

Mailjet bietet Kunden die Möglichkeit, E-Mails von freigegebenen IP- und dedizierten IP-Adressen zu senden. Bei Verwendung dedizierter IP-Adressen müssen die IP-Adressen zunächst „aufgewärmt“ werden, um Ihre eigene Reputation aufzubauen. Weitere Informationen finden Sie unter Wie erwärme ich meine IP?.

Erstellen eines Azure AD B2C-Richtlinienschlüssels

Speichern Sie als Nächstes den Mailjet-API-Schlüssel in einem Azure AD B2C-Richtlinienschlüssel, auf den Sie verweisen möchten.

  1. Melden Sie sich beim Azure-Portal an.
  2. Wenn Sie Zugriff auf mehrere Mandanten haben, wählen Sie das Symbol Einstellungen im Menü oben aus, um über das Menü Verzeichnisse + Abonnements zu Ihrem Azure AD B2C-Mandanten zu wechseln.
  3. Wählen Sie "Alle Dienste " in der oberen linken Ecke des Azure-Portals aus, und suchen Sie dann nach Azure AD B2C, und wählen Sie sie aus.
  4. Wählen Sie auf der Seite "Übersicht " die Option "Identity Experience Framework" aus.
  5. Wählen Sie "Richtlinienschlüssel" und dann "Hinzufügen" aus.
  6. Wählen Sie unter "Optionen" die Option "Manuell" aus.
  7. Geben Sie einen Namen für den Richtlinienschlüssel ein. Beispiel: MailjetApiKey. Das Präfix B2C_1A_ wird automatisch dem Namen Des Schlüssels hinzugefügt.
  8. Geben Sie im geheimen Schlüssel Ihren Mailjet-API-Schlüssel ein, den Sie zuvor aufgezeichnet haben.
  9. Wählen Sie für die Schlüsselverwendung"Signatur" aus.
  10. Wählen Sie "Erstellen" aus.
  11. Wählen Sie "Richtlinienschlüssel" und dann "Hinzufügen" aus.
  12. Wählen Sie unter "Optionen" die Option "Manuell" aus.
  13. Geben Sie einen Namen für den Richtlinienschlüssel ein. Beispiel: MailjetSecretKey. Das Präfix B2C_1A_ wird automatisch dem Namen Des Schlüssels hinzugefügt.
  14. Geben Sie im geheimen Schlüssel Ihren Mailjet Secret Key ein, den Sie zuvor aufgezeichnet haben.
  15. Wählen Sie für die Schlüsselverwendung"Signatur" aus.
  16. Wählen Sie "Erstellen" aus.

Erstellen einer Mailjet-Vorlage

Erstellen Sie mit einem Mailjet-Konto und dem Mailjet-API-Schlüssel, der in einem Azure AD B2C-Richtlinienschlüssel gespeichert ist, eine dynamische Mailjet-Transaktionsvorlage.

  1. Öffnen Sie auf der Mailjet-Website die Seite " Transaktionsvorlagen ", und wählen Sie " Neue Vorlage erstellen" aus.

  2. Wählen Sie Indem Sie es in HTML codieren aus, und wählen Sie dann Code von Grund auf neu aus.

  3. Geben Sie einen eindeutigen Vorlagennamen wie Verification email"Erstellen" ein, und wählen Sie dann "Erstellen" aus.

  4. Fügen Sie im HTML-Editor die folgende HTML-Vorlage ein, oder verwenden Sie ihre eigene. Die Parameter {{var:otp:""}} und {{var:email:""}} werden dynamisch durch den Einmalkennwortwert und die E-Mail-Adresse des Benutzers ersetzt.

    <!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. Erweitern Betreff bearbeiten oben links

    1. Geben Sie für "Betreff" einen Standardwert für den Betreff ein. Mailjet verwendet diesen Wert, wenn die API keinen Betreffparameter enthält.
    2. Geben Sie für den Namen Ihren Firmennamen ein.
    3. Wählen Sie für die Adresse Ihre E-Mail-Adresse aus.
    4. Wählen Sie Speichern aus.
  6. Wählen Sie oben "Speichern und Veröffentlichen" und dann "Ja", "Änderungen veröffentlichen" aus.

  7. Notieren Sie die Vorlagen-ID der Vorlage, die Sie in einem späteren Schritt erstellt haben. Sie geben diese ID an, wenn Sie die Anspruchstransformation hinzufügen.

Von Bedeutung

Die nächsten Schritte zeigen, wie Sie Ihre benutzerdefinierten RICHTLINIEN-XML-Dateien erstellen. Wir empfehlen Ihnen, eine Muster für benutzerdefinierte E-Mail-Überprüfungsrichtlinie zu verwenden, die auf GitHub verfügbar ist. DisplayControl_TrustFrameworkExtensions.xml verwendet TrustFrameworkExtensions.xml als Ausgangsdatei, stellen Sie daher sicher, dass Sie die Dateien TrustFrameworkBase.xml, TrustFrameworkLocalization.xml und TrustFrameworkExtensions.xml aus dem Startpaket 'SocialAndLocalAccounts' in Ihre Richtlinie einschließen.

Hinzufügen von Azure AD B2C-Anspruchstypen

Fügen Sie in Ihrer Richtlinie im <ClaimsSchema>-Element in <BuildingBlocks> die folgenden Anspruchstypen hinzu.

Diese Anspruchstypen sind erforderlich, um die E-Mail-Adresse mithilfe eines OTP-Codes (Einmaliges Kennwort) zu generieren und zu überprüfen.

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

Hinzufügen der Anspruchstransformation

Als Nächstes benötigen Sie eine Anspruchstransformation, um einen JSON-Zeichenfolgenanspruch auszugeben, der der Text der An Mailjet gesendeten Anforderung ist.

Die Struktur des JSON-Objekts wird durch die IDs in der Punktnotation der InputParameters und der TransformationClaimTypes der InputClaims definiert. Zahlen in Punktnotation implizieren Arrays. Die Werte stammen aus den Werten der InputClaims und den Value-Eigenschaften der InputParameters. Weitere Informationen zu JSON-Anspruchstransformationen finden Sie unter JSON-Anspruchstransformationen.

Fügen Sie im <ClaimsTransformations>-Element in <BuildingBlocks> die folgenden Anspruchstransformation hinzu. Nehmen Sie die folgenden Aktualisierungen an der Forderungstransformations-XML vor:

  • Aktualisieren Sie den Messages.0.TemplateID InputParameter-Wert mit der ID der Mailjet-Transaktionsvorlage, die Sie zuvor in der Vorlage "Mailjet erstellen" erstellt haben.
  • Aktualisieren Sie den Adresswert Messages.0.From.Email. Verwenden Sie eine gültige E-Mail-Adresse, um zu verhindern, dass die Überprüfungs-E-Mails als Spam gekennzeichnet werden.
  • Aktualisieren Sie den Wert des Eingabeparameters der Messages.0.Subject Betreffzeile mit einer betreffzeile, die für Ihre Organisation geeignet ist.
<!-- 
<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> -->

Hinzufügen einer DataUri-Inhaltsdefinition

Fügen Sie unterhalb der Anspruchstransformationen innerhalb von <BuildingBlocks> die folgende ContentDefinition hinzu, um auf den Daten-URI der Version 2.1.2 zu verweisen:

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

Ein Überprüfungsanzeigesteuerelement wird verwendet, um die E-Mail-Adresse mit einem Überprüfungscode zu überprüfen, der an den Benutzer gesendet wird.

Dieses Beispiel-Anzeigesteuerelement ist für Folgendes konfiguriert:

  1. Erfassen des email-Adressanspruchstyps vom Benutzer

  2. Generieren Sie mithilfe der SendCode Aktion einen OTP-Code, und senden Sie eine E-Mail mit dem OTP-Code an den Benutzer.

    E-Mail-Aktion

  3. Warten Sie, bis der Benutzer den verificationCode-Anspruchstyp mithilfe des dem Benutzer zugesandten Codes bereitstellt.

  4. Zurückgeben von email an das selbstbestätigte technische Profil, das einen Verweis auf dieses Anzeigesteuerelement enthält

Fügen Sie der Richtlinie unter „content definitions“ in <BuildingBlocks> das folgende DisplayControl-Element vom Typ VerificationControl hinzu.

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

Hinzufügen technischer Profile für Einmalkennwörter

Das GenerateOtp technische Profil generiert einen Code für die E-Mail-Adresse. Das VerifyOtp technische Profil überprüft den Code, der der E-Mail-Adresse zugeordnet ist. Sie können die Konfiguration des Formats und das Ablaufen des einmaligen Kennworts ändern. Weitere Informationen zu technischen Profilen für Einmalpasswörter finden Sie unter Einmalpasswort-Technisches Profil definieren.

Hinweis

OTP-Codes, die vom Web.TPEngine.Providers.OneTimePasswordProtocolProvider-Protokoll generiert werden, sind an die Browsersitzung gebunden. Dies bedeutet, dass ein Benutzer eindeutige OTP-Codes in verschiedenen Browsersitzungen generieren kann, die jeweils für ihre entsprechenden Sitzungen gültig sind. Im Gegensatz dazu ist ein OTP-Code, der vom integrierten E-Mail-Anbieter generiert wird, von der Browsersitzung unabhängig. Wenn ein Benutzer also einen neuen OTP-Code in einer neuen Browsersitzung generiert, ersetzt er den vorherigen OTP-Code.

Fügen Sie dem <ClaimsProviders> Element die folgenden technischen Profile hinzu.

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

Hinzufügen eines technischen REST-API-Profils

Dieses technische REST-API-Profil generiert den E-Mail-Inhalt (mit dem Mailjet-Format). Weitere Informationen zu RESTful technischen Profilen finden Sie unter Define a RESTful technical profile.

Wie bei den technischen OTP-Profilen fügen Sie dem <ClaimsProviders> Element die folgenden technischen Profile hinzu.

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

Erstellen eines Verweises auf das DisplayControl-Element

Fügen Sie im letzten Schritt einen Verweis auf das von Ihnen erstellte DisplayControl hinzu. Überschreiben Sie Ihre bestehenden LocalAccountSignUpWithLogonEmail und LocalAccountDiscoveryUsingEmailAddress selbstbestätigten technischen Profile, die in der Basisrichtlinie konfiguriert sind, mit dem folgenden XML-Schnipsel. Wenn Sie eine frühere Version der Azure AD B2C-Richtlinie verwendet haben, verwenden diese technischen Profile DisplayClaims mit einem Verweis auf die DisplayControl.

Weitere Informationen finden Sie unter Self-asserted technical profile und 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>

[Optional] Lokalisieren Ihrer E-Mails

Um die E-Mail zu lokalisieren, müssen Sie lokalisierte Zeichenfolgen an Mailjet oder Ihren E-Mail-Anbieter senden. Sie können z. B. den E-Mail-Betreff, den Textkörper, die Codenachricht oder die Signatur der E-Mail lokalisieren. Dazu können Sie die GetLocalizedStringsTransformation-Anspruchstransformation verwenden, um lokalisierte Zeichenfolgen in Anspruchstypen zu kopieren. Die Anspruchstransformation GenerateEmailRequestBody , die die JSON-Nutzlast generiert, verwendet Eingabeansprüche, die die lokalisierten Zeichenfolgen enthalten.

  1. Definieren Sie in Ihrer Richtlinie die folgenden Zeichenfolgenansprüche: Betreff, Nachricht, CodeIntro und Signatur.

  2. Definieren Sie eine GetLocalizedStringsTransformation-Anspruchstransformation , um lokalisierte Zeichenfolgenwerte in die Ansprüche aus Schritt 1 zu ersetzen.

  3. Ändern Sie die Anspruchstransformation GenerateEmailRequestBody , um Eingabeansprüche mit dem folgenden XML-Codeausschnitt zu verwenden.

  4. Aktualisieren Sie Ihre Mailjet-Vorlage so, dass dynamische Parameter anstelle aller Zeichenfolgen verwendet werden, die von Azure AD B2C lokalisiert werden.

    <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. Fügen Sie das folgende Lokalisierungselement hinzu.

    <!--
    <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. Fügen Sie Verweise auf die LocalizedResources-Elemente hinzu, indem Sie das ContentDefinitions-Element aktualisieren.

    <!--
    <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. Fügen Sie schließlich die folgende Eingabeanspruchstransformation zu den LocalAccountSignUpWithLogonEmail und LocalAccountDiscoveryUsingEmailAddress technischen Profilen hinzu.

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

[Optional] Lokalisieren der Benutzeroberfläche

Mithilfe des Elements „Lokalisierung“ können Sie mehrere Gebietsschemas oder Sprachen in der Richtlinie für die User Journeys unterstützen. Die Lokalisierungsunterstützung in Richtlinien ermöglicht es Ihnen, sprachspezifische Zeichenfolgen sowohl für Elemente der Überprüfungsanzeigesteuerungs-Benutzeroberfläche als auch einmalige Kennwortfehlermeldungen bereitzustellen. Fügen Sie die folgende LocalizedString zu Ihren LocalizedResources hinzu.

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