Freigeben über


Konfigurieren eines benutzerdefinierten E-Mail-Anbieters für Sendeereignisse einmaliger Passcodes (Vorschau)

Gilt für:Weißer Kreis mit grauem X. Mitarbeitermandanten Grüner Kreis mit weißem Häkchen. Externe Mandanten (weitere Informationen)

Dieser Artikel enthält eine Anleitung zum Konfigurieren und Einrichten eines benutzerdefinierten E-Mail-Anbieters für den Send-Ereignistyp One Time Passcode (OTP). Das Ereignis wird ausgelöst, wenn eine OTP-E-Mail aktiviert wird. Sie können eine REST-API aufrufen, um Ihren eigenen E-Mail-Anbieter zu verwenden, indem Sie eine REST-API aufrufen.

Tipp

Jetzt testen

Um dieses Feature auszuprobieren, wechseln Sie zur Woodgrove Groceries-Demo, und starten Sie den Anwendungsfall „Verwenden eines benutzerdefinierten E-Mail-Anbieters für einen einmaligen Code“.

Voraussetzungen

Schritt 1: Erstellen einer Azure Functions-App

In diesem Abschnitt erfahren Sie, wie Sie eine Azure Function-App im Azure-Portal einrichten. Die Funktions-API ist das Gateway zu Ihrem E-Mail-Anbieter. Sie erstellen eine Azure Function-App, um die HTTP-Triggerfunktion zu hosten und die Einstellungen in der Funktion zu konfigurieren.

Tipp

Die Schritte in diesem Artikel können je nach dem Portal, mit dem Sie beginnen, geringfügig variieren.

  1. Melden Sie sich beim Azure-Portal mindestens mit der Rolle Anwendungsadministrator und Authentifizierungsadministrator an.

  2. Klicken Sie im Menü des Azure-Portals oder auf der Startseite auf Ressource erstellen.

  3. Suchen Sie nach Funktions-App, und wählen Sie diese Option und dann Erstellen aus.

  4. Wählen Sie auf der Seite Funktions-App-App erstellen die Option Verbrauch und dann Auswählen aus.

  5. Erstellen Sie auf der Seite Funktions-App (Verbrauch) auf der Registerkarte Grundlagen eine Funktions-App, welche die in der folgenden Tabelle angegebenen Einstellungen verwendet:

    Einstellung Vorgeschlagener Wert BESCHREIBUNG
    Abonnement Ihr Abonnement Das Abonnement, unter dem die neue Funktions-App erstellt wird.
    Ressourcengruppe myResourceGroup Wählen Sie die Ressourcengruppe aus, die zum Einrichten der Azure Communications Service- und E-Mail-Communications Service-Ressourcen als Teil der Voraussetzungen verwendet wird
    Name der Funktions-App Global eindeutiger Name Ein Name, der die neue Funktions-App identifiziert. Gültige Zeichen sind a-z (Groß-/Kleinschreibung nicht beachtet), 0-9 und -.
    Bereitstellen von Code oder eines Containerimages Code Option zum Veröffentlichen von Codedateien oder eines Docker-Containers. In diesem Tutorial wählen Sie Code aus.
    Laufzeitstapel .NET Ihre bevorzugte Programmiersprache. In diesem Tutorial wählen Sie .NET aus.
    Version 8 (LTS) In-Process Die Version der .NET-Runtime. In-Process bedeutet, dass Sie Funktionen im Portal erstellen und ändern können. Dies wird für diesen Leitfaden empfohlen.
    Region Bevorzugte Region Wählen Sie eine Region in Ihrer Nähe oder in der Nähe anderer Dienste aus, auf die Ihre Funktionen zugreifen können.
    Betriebssystem Windows Das Betriebssystem wird für Sie basierend auf der Auswahl des Runtimestapels vorab ausgewählt.
  6. Wählen Sie Überprüfen und erstellen aus, um die ausgewählte App-Konfiguration zu überprüfen, und wählen Sie dann Erstellen aus. Die Bereitstellung nimmt einige Minuten in Anspruch.

  7. Wählen Sie nach der Bereitstellung Zu Ressource wechseln aus, um Ihre neue Funktions-App anzuzeigen.

1.1 Erstellen einer HTTP-Triggerfunktion

Nachdem die Azure-Funktions-App erstellt wurde, können Sie eine HTTP-Triggerfunktion erstellen. Mit dem HTTP-Trigger können Sie eine Funktion mit einer HTTP-Anforderung aufrufen. Auf diesen HTTP-Trigger wird von Ihrer benutzerdefinierten Microsoft Entra-Authentifizierungserweiterung verwiesen.

  1. Wählen Sie in Ihrer Funktions-App im Menü die Option Funktionen aus.
  2. Wählen Sie Funktion erstellen aus.
  3. Suchen Sie im Fenster Funktion erstellen unter Vorlage auswählenHTTP-Trigger-Vorlage und wählen Sie sie aus. Wählen Sie Weiter aus.
  4. Geben Sie unter Vorlagendetails für die Eigenschaft Funktionsname die Zeichenfolge CustomAuthenticationExtensionsAPI ein.
  5. Wählen Sie für die Autorisierungsstufe die Option Funktion aus.
  6. Klicken Sie auf Erstellen.

1.2 Bearbeiten der Funktion

Der Code beginnt mit dem Lesen des eingehenden JSON-Objekts. Microsoft Entra ID sendet das JSON-Objekt an Ihre API. In diesem Beispiel werden die E-Mail-Adresse (ID) und das OTP gelesen. Anschließend sendet der Code die Details an den Kommunikationsdienst, um die E-Mail mithilfe einer dynamischen Vorlage zu senden.

In diesem Anleitungshandbuch wird das OTP-Sendeereignis mithilfe von Azure Communication Services und SendGrid veranschaulicht. Verwenden Sie die Registerkarten, um Ihre Implementierung auszuwählen.

  1. Wählen Sie im Menü die Option Programmieren und testen aus.

  2. Ersetzen Sie den gesamten Code durch den folgenden Codeausschnitt.

    using System.Dynamic;
    using System.Text.Json;
    using System.Text.Json.Nodes;
    using System.Text.Json.Serialization;
    using Azure.Communication.Email;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.HttpResults;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Logging;
    
    namespace Company.AuthEvents.OnOtpSend.CustomEmailACS
    {
        public class CustomEmailACS
        {
            private readonly ILogger<CustomEmailACS> _logger;
    
            public CustomEmailACS(ILogger<CustomEmailACS> logger)
            {
                _logger = logger;
            }
    
            [Function("OnOtpSend_CustomEmailACS")]
            public async Task<IActionResult> RunAsync([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req)
            {
                _logger.LogInformation("C# HTTP trigger function processed a request.");
    
                // Get the request body
                string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
                JsonNode jsonPayload = JsonNode.Parse(requestBody)!;
    
                // Get OTP and mail to
                string emailTo = jsonPayload["data"]!["otpContext"]!["identifier"]!.ToString();
                string otp = jsonPayload["data"]!["otpContext"]!["onetimecode"]!.ToString();
    
                // Send email
                await SendEmailAsync(emailTo, otp);
    
                // Prepare response
                ResponseObject responseData = new ResponseObject("microsoft.graph.OnOtpSendResponseData");
                responseData.Data.Actions = new List<ResponseAction>() { new ResponseAction(
                    "microsoft.graph.OtpSend.continueWithDefaultBehavior") };
    
                return new OkObjectResult(responseData);
            }
    
            private async Task SendEmailAsync(string emailTo, string code)
            {
                // Get app settings
                var connectionString = Environment.GetEnvironmentVariable("mail_connectionString");
                var sender = Environment.GetEnvironmentVariable("mail_sender");
                var subject = Environment.GetEnvironmentVariable("mail_subject");
    
                try
                {
                    if (!string.IsNullOrEmpty(connectionString))
                    {
                        var emailClient = new EmailClient(connectionString);
                        var body = EmailTemplate.GenerateBody(code);
    
                        _logger.LogInformation($"Sending OTP to {emailTo}");
    
                        EmailSendOperation emailSendOperation = await emailClient.SendAsync(
                        Azure.WaitUntil.Started,
                        sender,
                        emailTo,
                        subject,
                        body);
                    }
                }
                catch (System.Exception ex)
                {
                    _logger.LogError(ex.Message);
                }
            }
        }
    
        public class ResponseObject
        {
            [JsonPropertyName("data")]
            public Data Data { get; set; }
    
            public ResponseObject(string dataType)
            {
                Data = new Data(dataType);
            }
        }
    
        public class Data
        {
            [JsonPropertyName("@odata.type")]
            public string DataType { get; set; }
            [JsonPropertyName("actions")]
            public List<ResponseAction> Actions { get; set; }
    
            public Data(string dataType)
            {
                DataType = dataType;
            }
        }
    
        public class ResponseAction
        {
            [JsonPropertyName("@odata.type")]
            public string DataType { get; set; }
    
            public ResponseAction(string dataType)
            {
                DataType = dataType;
            }
        }
    
        public class EmailTemplate
        {
            public static string GenerateBody(string oneTimeCode)
            {
                return @$"<html><body>
                <div style='background-color: #1F6402!important; padding: 15px'>
                    <table>
                    <tbody>
                        <tr>
                            <td colspan='2' style='padding: 0px;font-family: "Segoe UI Semibold", "Segoe UI Bold", "Segoe UI", "Helvetica Neue Medium", Arial, sans-serif;font-size: 17px;color: white;'>Woodgrove Groceries live demo</td>
                        </tr>
                        <tr>
                            <td colspan='2' style='padding: 15px 0px 0px;font-family: "Segoe UI Light", "Segoe UI", "Helvetica Neue Medium", Arial, sans-serif;font-size: 35px;color: white;'>Your Woodgrove verification code</td>
                        </tr>
                        <tr>
                            <td colspan='2' style='padding: 25px 0px 0px;font-family: "Segoe UI", Tahoma, Verdana, Arial, sans-serif;font-size: 14px;color: white;'> To access <span style='font-family: "Segoe UI Bold", "Segoe UI Semibold", "Segoe UI", "Helvetica Neue Medium", Arial, sans-serif; font-size: 14px; font-weight: bold; color: white;'>Woodgrove Groceries</span>'s app, please copy and enter the code below into the sign-up or sign-in page. This code is valid for 30 minutes. </td>
                        </tr>
                        <tr>
                            <td colspan='2' style='padding: 25px 0px 0px;font-family: "Segoe UI", Tahoma, Verdana, Arial, sans-serif;font-size: 14px;color: white;'>Your account verification code:</td>
                        </tr>
                        <tr>
                            <td style='padding: 0px;font-family: "Segoe UI Bold", "Segoe UI Semibold", "Segoe UI", "Helvetica Neue Medium", Arial, sans-serif;font-size: 25px;font-weight: bold;color: white;padding-top: 5px;'>
                            {oneTimeCode}</td>
                            <td rowspan='3' style='text-align: center;'>
                                <img src='https://woodgrovedemo.com/custom-email/shopping.png' style='border-radius: 50%; width: 100px'>
                            </td>
                        </tr>
                        <tr>
                            <td style='padding: 25px 0px 0px;font-family: "Segoe UI", Tahoma, Verdana, Arial, sans-serif;font-size: 14px;color: white;'> If you didn't request a code, you can ignore this email. </td>
                        </tr>
                        <tr>
                            <td style='padding: 25px 0px 0px;font-family: "Segoe UI", Tahoma, Verdana, Arial, sans-serif;font-size: 14px;color: white;'> Best regards, </td>
                        </tr>
                        <tr>
                            <td>
                                <img src='https://woodgrovedemo.com/Company-branding/headerlogo.png' height='20'>
                            </td>
                            <td style='font-family: "Segoe UI", Tahoma, Verdana, Arial, sans-serif;font-size: 14px;color: white; text-align: center;'>
                                <a href='https://woodgrovedemo.com/Privacy' style='color: white; text-decoration: none;'>Privacy Statement</a>
                            </td>
                        </tr>
                    </tbody>
                    </table>
                </div>
                </body></html>";
            }
        }
    }
    
  3. Wählen Sie Get Function URL aus und kopieren Sie die Funktionsschlüssel-URL, der daher verwendet und als {Function_Url} bezeichnet wird. Schließen der Funktion.

Schritt 2: Hinzufügen von Verbindungszeichenfolgen zur Azure-Funktion

Mit Verbindungszeichenfolgen können Communication Services-SDKs eine Verbindung mit Azure herstellen und sich bei Azure authentifizieren. Für Azure Communication Services und SendGrid müssen Sie diese Verbindungszeichenfolgen ihrer Azure Function-App als Umgebungsvariablen hinzufügen.

2.1: Extrahieren der Verbindungszeichenfolgen und Dienstendpunkte aus Ihrer Azure Communication Services-Ressource

Sie können auf die Communication Services-Verbindungszeichenfolgen und -Dienstendpunkte über das Azure-Portal oder programmgesteuert mit Azure Resource Manager-APIs zugreifen.

  1. Öffnen Sie auf der Startseite im Azure-Portal das Portalmenü und suchen Sie Alle Ressourcen und wählen Sie es aus.

  2. Suchen Sie nach dem Azure Communications Service, der als Teil der Voraussetzungen für diesen Artikel erstellt wurde, und wählen Sie diesen aus.

  3. Wählen Sie im linken Bereich das Dropdownmenü Einstellungen aus und wählen Sie dann Schlüssel aus.

  4. Kopieren Sie den Endpunkt und kopieren Sie aus Primärschlüssel die Werte für Schlüssel und Verbindungszeichenfolge.

    Screenshot der Seite „Azure Communications Service Keys“ mit den Endpunkt- und Schlüsselspeicherorten.

2.2: Hinzufügen der Verbindungszeichenfolgen zur Azure-Funktion

  1. Navigieren Sie zurück zu der Azure-Funktion, die Sie in Erstellen einer Azure Function-App erstellt haben.

  2. Wählen Sie auf der Seite Übersicht Ihrer Funktions-App im linken Menü Einstellungen>Umgebungsvariablen aus und fügen Sie die folgenden App-Einstellungen hinzu. Nachdem alle Einstellungen hinzugefügt wurden, wählen Sie Übernehmen aus, und Bestätigen Sie.

    Einstellung Wert (Beispiel) BESCHREIBUNG
    mail_connectionString https://ciamotpcommsrvc.unitedstates.communication.azure.com/:accesskey=A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u Der Azure Communication Services-Endpunkt
    mail_sender from.email@myemailprovider.com Die von E-Mail-Adresse.
    mail_subject CIAM Demo Der Betreff der E-Mail.

Schritt 3: Registrieren einer benutzerdefinierten Authentifizierungserweiterung

In diesem Schritt konfigurieren Sie eine benutzerdefinierte Authentifizierungserweiterung, die von Microsoft Entra ID zum Aufrufen Ihrer Azure-Funktion verwendet wird. Die benutzerdefinierte Authentifizierungserweiterung enthält Informationen zu Ihrem REST-API-Endpunkt, zu den aus Ihrer REST-API geparsten Ansprüchen sowie zur Authentifizierung bei Ihrer REST-API. Verwenden Sie entweder das Azure-Portal oder Microsoft Graph, um eine Anwendung zu registrieren, um Ihre benutzerdefinierte Authentifizierungserweiterung für Ihre Azure-Funktion zu authentifizieren.

Registrieren einer benutzerdefinierten Authentifizierungserweiterung

  1. Melden Sie sich beim Azure-Portal mindestens mit der Rolle Anwendungsadministrator und Authentifizierungsadministrator an.

  2. Suchen Und wählen Sie Microsoft Entra-ID und Enterprise-Anwendungen aus.

  3. Wählen Sie Benutzerdefinierte Authentifizierungserweiterungen und dann Benutzerdefinierte Erweiterung erstellen aus.

  4. Wählen Sie unter Basics den Ereignistyp EmailOtpSend aus und wählen Sie Weiter aus.

    Screenshot: Azure-Portal mit hervorgehobenem EmailOtpSend-Ereignis

  5. Füllen Sie auf der Registerkarte Endpunktkonfiguration die folgenden Eigenschaften aus und wählen Sie dann Weiter aus, um fortzufahren.

    • Name – Ein Name für Ihre benutzerdefinierte Authentifizierungserweiterung. Beispiel: E-Mail OTP Send.
    • Ziel-URL: Die {Function_Url} Ihrer Azure-Funktions-URL. Navigieren Sie zur Seite Übersicht Ihrer Azure Function-App, und wählen Sie dann die von Ihnen erstellte Funktion aus. Wählen Sie auf der Seite Funktionsübersicht die Option Funktions-URL abrufen aus, und verwenden Sie das Kopiersymbol, um die URL customauthenticationextension_extension (Systemschlüssel) zu kopieren.
    • Beschreibung – Eine Beschreibung für Ihre benutzerdefinierten Authentifizierungserweiterungen.
  6. Wählen Sie auf der Registerkarte API-Authentifizierung die Option Neue App-Registrierung erstellen aus, um eine App-Registrierung zu erstellen, die Ihre Funktions-App darstellt.

  7. Weisen Sie der App einen Namen zu, z. B. Azure Functions-Authentifizierungsereignis-API und wählen Sie Weiter aus.

  8. Wählen Sie auf der Registerkarte Anwendungen die Anwendung aus, die der benutzerdefinierten Authentifizierungserweiterung zugeordnet werden soll. Wählen Sie Weiter aus. Sie haben die Möglichkeit, sie über den gesamten Mandanten hinweg anzuwenden, indem Sie das Kontrollkästchen aktivieren. Klicken Sie auf Weiter, um fortzufahren.

  9. Überprüfen Sie auf der Registerkarte Überprüfen, ob die Details für die benutzerdefinierte Authentifizierungserweiterung korrekt sind. Beachten Sie die App-ID unter API-Authentifizierung, die zum Konfigurieren der Authentifizierung für Ihre Azure Function in Ihrer Azure Function-App erforderlich ist. Klicken Sie auf Erstellen.

Nachdem Ihre benutzerdefinierte Authentifizierungserweiterung erstellt wurde, öffnen Sie die Anwendung im Portal unter App-Registrierungen und wählen Sie API-Berechtigungen aus.

Wählen Sie auf der Seite API-Berechtigungen die Schaltfläche Administratoreinwilligung für „YourTenant“ erteilen aus, um der registrierten App die Administratoreinwilligung zu erteilen, damit sich die benutzerdefinierte Authentifizierungserweiterung bei Ihrer API authentifizieren kann. Die benutzerdefinierte Authentifizierungserweiterung verwendet client_credentials für die Authentifizierung bei der Azure-Funktions-App mit der Berechtigung Receive custom authentication extension HTTP requests.

Im folgenden Screenshot wird gezeigt, wie Berechtigungen erteilt werden.

Screenshot des Azure-Portals und zum Erteilen der Administratorzustimmung.

Schritt 4: Konfigurieren einer OpenID Connect-App zum Testen mit

Sie können die https://jwt.ms-App verwenden, um ein Token abzurufen und die benutzerdefinierte Authentifizierungserweiterung zu testen. Dabei handelt es sich um eine Microsoft-Webanwendung, die den decodierten Inhalt eines Tokens anzeigt (der Inhalt des Tokens verlässt niemals Ihren Browser).

Führen Sie die folgenden Schritte aus, um die Webanwendung jwt.ms zu registrieren:

4.1. Registrieren einer Testwebanwendung

  1. Melden Sie sich beim Microsoft Entra Admin Center mindestens mit der Rolle Anwendungsadministrator an.
  2. Navigieren Sie zu Identität>Anwendungen>Anwendungsregistrierungen.
  3. Wählen Sie Neue Registrierung aus.
  4. Geben Sie unter Name einen Namen für die Anwendung ein. Beispielsweise „Meine Testanwendung“ oder My Test application.
  5. Wählen Sie unter Unterstützte Kontotypen die Option Nur Konten in diesem Organisationsverzeichnis aus.
  6. Wählen Sie im Dropdownmenü Plattform auswählen unter Umleitungs-URI die Option Web aus, und geben Sie dann in das URL-Textfeld die Zeichenfolge https://jwt.ms ein.
  7. Wählen Sie Registrieren aus, um die App-Registrierung abzuschließen.
  8. Kopieren Sie in Ihrer App-Registrierung unter Übersicht die Anwendung (Client)-ID, die später verwendet wird und als {App_to_sendotp_ID} bezeichnet wird. In Microsoft Graph wird sie durch die appId-Eigenschaft referenziert.

Im folgenden Screenshot wird gezeigt, wie My Test application (Meine Testanwendung) registriert wird.

Screenshot: Auswählen des unterstützten Kontotyps und des Umleitungs-URIs.

4.1 Abrufen der Anwendungs-ID

Kopieren Sie in Ihrer App-Registrierung unter Übersicht die Anwendungs-ID (Client-ID). Die App-ID wird in späteren Schritten als {App_to_sendotp_ID} bezeichnet. In Microsoft Graph wird sie durch die appId-Eigenschaft referenziert.

4.2 Aktivieren des impliziten Flows

Die Testanwendung jwt.ms verwendet den impliziten Flow. Aktivieren Sie den impliziten Flow in Ihrer App-Registrierung Meine Testanwendung:

  1. Wählen Sie unter Verwalten die Option Authentifizierung aus.
  2. Aktivieren Sie unter Implizite Genehmigung und Hybridflows das Kontrollkästchen ID-Token (für implizite und Hybridflows verwendet).
  3. Klicken Sie auf Speichern.

Hinweis

Die jwt.ms-App verwendet den impliziten Fluss zum Abrufen eines ID-Tokens und dient nur zu Testzwecken. Der implizite Fluss wird für Produktionsanwendungen nicht empfohlen. Verwenden Sie für Produktionsanwendungen den Autorisierungscodefluss.

Schritt 5: Schützen Ihrer Azure Function

Die benutzerdefinierte Microsoft Entra-Authentifizierungserweiterung verwendet den Server-zu-Server-Flow, um ein Zugriffstoken abzurufen, das im HTTP-Header Authorization an Ihre Azure-Funktion gesendet wird. Wenn Sie Ihre Funktion in Azure – insbesondere in einer Produktionsumgebung – veröffentlichen, müssen Sie das im Autorisierungsheader gesendete Token überprüfen.

Führen Sie zum Schutz Ihrer Azure-Funktion die folgenden Schritte zum Integrieren der Microsoft Entra-Authentifizierung aus, um eingehende Token mit der Azure Functions-Authentifizierungsereignis-API zur Authentifizierungsregistrierung zu überprüfen.

Hinweis

Wenn die Azure-Funktions-App in einem anderen Azure-Mandanten gehostet wird als dem Mandanten, in dem Ihre benutzerdefinierte Authentifizierungserweiterung registriert ist, fahren Sie mit dem Schritt Verwenden des OpenID Connect-Identitätsanbieters fort.

  1. Melden Sie sich beim Azure-Portal an.
  2. Navigieren Sie zu der zuvor veröffentlichten Funktions-App, und wählen Sie diese aus.
  3. Wählen Sie Authentifizierung im Menü auf der linken Seite.
  4. Wählen Sie Identitätsanbieter hinzufügen aus.
  5. Wählen Sie im Dropdownmenü Microsoft als Identitätsanbieter aus.
  6. Wählen Sie unter App-Registrierung ->App-Registrierungstyp die Option Vorhandene App-Registrierung in diesem Verzeichnis auswählen aus, und wählen Sie dann die App-Registrierung Azure Functions-Authentifizierungsereignis-API aus, die Sie zuvor beim Registrieren des benutzerdefinierten E-Mailanbieters erstellt haben.
  7. Fügen Sie den Ablauf des geheimen Clientschlüssels für die App hinzu.
  8. Wählen Sie unter Nicht authentifizierte Anforderungen die Option HTTP 401 (nicht autorisiert): für APIs empfohlen aus.
  9. Deaktivieren Sie die Option Tokenspeicher.
  10. Wählen Sie Hinzufügen aus, um Ihrer Azure-Funktion die Authentifizierung hinzuzufügen.

Screenshot: Hinzufügen von Authentifizierung zu Ihrer Funktions-App.

5.1 Verwenden des OpenID Connect-Identitätsanbieters

Wenn Sie Microsoft als Identitätsanbieter konfiguriert haben, überspringen Sie diesen Schritt. Wird die Azure-Funktion jedoch in einem anderen Mandanten gehostet als dem Mandanten, in dem Ihre benutzerdefinierte Authentifizierungserweiterung registriert ist, führen Sie die folgenden Schritte aus, um Ihre Funktion zu schützen:

  1. Melden Sie sich beim Azure-Portal an, navigieren Sie zu der zuvor veröffentlichten Funktions-App, und wählen Sie diese aus.

  2. Wählen Sie im linken Bereich Authentifizierung aus.

  3. Wählen Sie Identitätsanbieter hinzufügen aus.

  4. Wählen Sie OpenID Connect als Identitätsanbieter aus.

  5. Geben Sie einen Namen an, z. B. Contoso Microsoft Entra ID.

  6. Geben Sie unter dem Metadateneintrag die folgende URL zur Dokument-URL ein. Ersetzen Sie {tenantId} durch Ihre Mandanten-ID von Microsoft Entra und {tenantname} durch den Namen Ihres Mandanten ohne „onmicrosoft.com“.

    https://{tenantname}.ciamlogin.com/{tenantId}/v2.0/.well-known/openid-configuration
    
  7. Geben Sie unter der App-Registrierung die Anwendungs-ID (Client-ID) der App-Registrierung Azure Functions-Authentifizierungsereignis-API ein, die Sie zuvor erstellt haben.

  8. Im Microsoft Entra Admin Center:

    1. Wählen Sie die App-Registrierung Azure Functions-Authentifizierungsereignis-API aus, die Sie zuvor erstellt haben.
    2. Wählen Sie Zertifikate und Geheimnisse>Geheime Clientschlüssel>Neuer geheimer Clientschlüssel aus.
    3. Fügen Sie eine Beschreibung für Ihren geheimen Clientschlüssel hinzu.
    4. Wählen Sie für das Geheimnis eine Ablauffrist aus, oder geben Sie eine benutzerdefinierte Lebensdauer an.
    5. Wählen Sie Hinzufügen.
    6. Notieren Sie sich den Wert des geheimen Clientschlüssels, der in Ihrem Clientanwendungscode verwendet werden soll. Dieser Geheimniswert kann nach Verlassen dieser Seite nicht erneut angezeigt werden.
  9. Geben Sie in der Azure-Funktion unter der App-Registrierung den geheimen Clientschlüssel ein.

  10. Deaktivieren Sie die Option Tokenspeicher.

  11. Wählen Sie Hinzufügen aus, um den OpenID Connect-Identitätsanbieter hinzuzufügen.

Schritt 6: Testen der Anwendung

Führen Sie die folgenden Schritte aus, um Ihren benutzerdefinierten E-Mailanbieter zu testen:

  1. Öffnen Sie ein neues privates Browserfenster, und navigieren Sie zur folgenden URL, um sich anzumelden.

    https://{tenantname}.ciamlogin.com/{tenant-id}/oauth2/v2.0/authorize?client_id={App_to_sendotp_ID}&response_type=id_token&redirect_uri=https://jwt.ms&scope=openid&state=12345&nonce=12345
    
  2. Ersetzen Sie {tenant-id} durch Ihre Mandanten-ID, Ihren Mandantennamen oder einen Ihrer überprüften Domänennamen. Beispiel: contoso.onmicrosoft.com.

  3. Ersetzen Sie {tenantname} durch den Namen Ihres Mandanten ohne „onmicrosoft.com“.

  4. Ersetzen Sie {App_to_sendotp_ID} durch die ID der App-Registrierung „Meine Testanwendung“.

  5. Stellen Sie sicher, dass Sie sich mit einem Einmaligen Passcode per E-Mail anmelden. Wählen Sie dann Code Senden aus. Stellen Sie sicher, dass der an die registrierten E-Mail-Adressen gesendete Code den oben registrierten benutzerdefinierten Anbieter verwendet.

Schritt 7: Fallback auf Microsoft-Anbieter

Wenn innerhalb der Erweiterungs-API ein Fehler auftritt, sendet die Entra-ID standardmäßig kein OTP an den Benutzer. Sie können stattdessen das Verhalten auf Fehler festlegen, um auf den Microsoft-Anbieter zurückzugreifen.

Führen Sie die folgende Anforderung aus, um dies zu aktivieren. Ersetzen Sie {customListenerOjectId} durch die zuvor aufgezeichnete Listener-ID der benutzerdefinierten Authentifizierungserweiterung.

  • Sie benötigen die delegierte Berechtigung EventListener.ReadWrite.All.
PATCH https://graph.microsoft.com/beta/identity/authenticationEventListeners/{customListenerOjectId}

{
    "@odata.type": "#microsoft.graph.onEmailOtpSendListener",
    "handler": {
        "@odata.type": "#microsoft.graph.onOtpSendCustomExtensionHandler",
        "configuration": {
            "behaviorOnError": {
                "@odata.type": "#microsoft.graph.fallbackToMicrosoftProviderOnError"
            }
        }
    }
}

Siehe auch