Sdílet prostřednictvím


Konfigurace vlastního poskytovatele e-mailu pro odesílání událostí s jednorázovým heslem (Preview)

Platí pro: Bílý kruh se šedým symbolem X. Tenanty pracovní síly Zelený kruh s bílým symbolem zaškrtnutí Externí tenanty (Zjistěte více)

Tento článek obsahuje průvodce konfigurací a nastavením vlastního poskytovatele e-mailu pro typ události Jednorázové heslo (OTP). Událost se aktivuje při aktivaci e-mailu OTP. Umožňuje volat rozhraní REST API pro použití vlastního poskytovatele e-mailu voláním rozhraní REST API.

Tip

Vyzkoušet

Pokud si chcete tuto funkci vyzkoušet, přejděte na ukázku Woodgrove Potraviny a spusťte případ použití "Použít vlastního poskytovatele e-mailu pro jednorázový kód".

Požadavky

Krok 1: Vytvoření aplikace Funkcí Azure

V této části se dozvíte, jak nastavit aplikaci Funkcí Azure na webu Azure Portal. Rozhraní funkce API je bránou k vašemu emailovému poskytovateli. Vytvoříte aplikaci Azure Functions pro hostování funkce triggeru HTTP a nakonfigurujete nastavení ve funkci.

Tip

Postup v tomto článku se může mírně lišit v závislosti na portálu, od který začínáte.

  1. Přihlaste se k webu Azure Portal jako alespoň správce aplikací a správce ověřování.

  2. V nabídce webu Azure Portal nebo na domovské stránce vyberte Vytvořit prostředek.

  3. Vyhledejte a vyberte Function App a vyberte Vytvořit.

  4. Na stránce Vytvořit funkční aplikaci vyberte Consumption a pak Výběr.

  5. Na stránce Vytvořit aplikaci funkcí (Consumption) na kartě Základy vytvořte aplikaci funkcí pomocí nastavení uvedených v následující tabulce:

    Nastavení Navrhovaná hodnota Popis
    Předplatné Vaše předplatné Předplatné, pod kterým se vytvoří nová aplikace funkcí.
    Skupina prostředků myResourceGroup V rámci požadavků vyberte skupinu prostředků použitou k nastavení prostředků služby Azure Communications Service a e-mailové komunikace.
    Název aplikace Function Globálně jedinečný název Název, který identifikuje novou aplikaci funkce. Platné znaky jsou a-z (bez rozlišování malých a velkých písmen), 0-9 a -.
    Nasazení kódu nebo image kontejneru Kód Možnost publikování souborů kódu nebo kontejneru Docker Pro účely tohoto kurzu vyberte Kód.
    Zásobník modulu runtime .NET Preferovaný programovací jazyk. Pro účely tohoto kurzu vyberte .NET.
    Verze 8 (LTS) V procesu Verze modulu runtime .NET V procesu znamená, že můžete vytvářet a upravovat funkce v portálu, což je doporučeno podle tohoto průvodce.
    Oblast Upřednostňovaná oblast Vyberte oblast, která je blízko vás nebo blízko jiných služeb, ke kterým mají vaše funkce přístup.
    Operační systém Windows Operační systém je předem vybraný na základě výběru zásobníku modulu runtime.
  6. Výběrem možnosti Zkontrolovat a vytvořit zkontrolujte výběry konfigurace aplikace a pak vyberte Vytvořit. Nasazení trvá několik minut.

  7. Po nasazení vyberte Přejít k prostředku a zobrazte svou novou funkční aplikaci.

1.1 Vytvoření funkce triggeru HTTP

Po vytvoření aplikace Funkcí Azure vytvořte funkci spouštěče HTTP. Trigger HTTP umožňuje vyvolat funkci s požadavkem HTTP. Na tento HTTP spouštěč odkazuje vaše vlastní rozšíření pro ověřování Microsoft Entra.

  1. V rámci Function App v nabídce vyberte Funkce.
  2. Vyberte Vytvořit funkci.
  3. V okně Vytvořit funkci v části Vybrat šablonu vyhledejte a vyberte šablonu triggeru HTTP. Vyberte Další.
  4. V části Podrobnosti šablony zadejte CustomAuthenticationExtensionsAPI pro vlastnost Název funkce.
  5. Pro úroveň autorizace vyberte funkci.
  6. Vyberte Vytvořit.

1.2 Úprava funkce

Kód začíná čtením příchozího objektu JSON. Microsoft Entra ID odešle JSON objekt do vašeho rozhraní API. V tomto příkladu čte adresu e-mailu (identifikátor) a jednorázové heslo. Pak kód odešle podrobnosti komunikační službě, aby e-mail poslal pomocí dynamické šablony.

Tento návod demonstruje akci odeslání jednorázového hesla pomocí služeb Azure Communication Services a SendGrid. Pomocí karet vyberte implementaci.

  1. V nabídce vyberte Kód + Test.

  2. Celý kód nahraďte následujícím fragmentem kódu.

    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. Vyberte Získat adresu URL funkce a zkopírujte adresu URL klíče funkce, která se následně používá a označuje jako {Function_Url}. Zavřete funkci.

Krok 2: Přidání připojovacích řetězců do funkce Azure Function

Připojovací řetězce umožňují sadám SDK komunikačních služeb připojit se k Azure a ověřit je. Pro Azure Communication Services a SendGrid pak budete muset tyto připojovací řetězce přidat do aplikace Funkce Azure jako proměnné prostředí.

2.1: Extrahujte připojovací řetězce a koncové body služby z vašeho prostředku Azure Communication Services.

Ke svým připojovacím řetězcům a koncovým bodům služby Komunikačních služeb můžete přistupovat z portálu Azure nebo programově prostřednictvím rozhraní API Azure Resource Manager.

  1. Na domovské stránce webu Azure Portal otevřete nabídku portálu, vyhledejte a vyberte Všechny prostředky.

  2. Vyhledejte a vyberte službu Azure Communications Service vytvořenou v rámci požadavků tohoto článku.

  3. V levém podokně vyberte rozevírací seznam Nastavení a pak vyberte Klíče.

  4. Zkopírujte koncový bod a z primárního klíče zkopírujte hodnoty pro klíč a připojovací řetězec.

    Snímek obrazovky se stránkou Klíče služby Azure Communications Service zobrazující umístění koncového bodu a klíče

2.2: Přidejte připojovací řetězce do funkce Azure

  1. Vraťte se k funkci Azure Functions, kterou jste vytvořili v části Vytvoření aplikace Azure Functions.

  2. Na stránce Přehled vaší funkce aplikace v nabídce vlevo vyberte Nastavení>Proměnné prostředí a přidejte následující nastavení aplikace. Po přidání všech nastavení vyberte Použít a pak Potvrďte.

    Nastavení Hodnota (příklad) Popis
    mail_connectionString https://ciamotpcommsrvc.unitedstates.communication.azure.com/:accesskey=A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u Koncový bod služby Azure Communication Services
    mail_sender from.email@myemailprovider.com Odesílací e-mailová adresa.
    mail_subject Ukázka CIAM Předmět e-mailu.

Krok 3: Registrace vlastního rozšíření ověřování

V tomto kroku nakonfigurujete vlastní rozšíření ověřování, které Microsoft Entra ID používá k volání vaší funkce Azure. Rozšíření vlastního ověřování obsahuje informace o koncovém bodu vašeho REST API, o požadavcích, které z vašeho REST API zpracovává, a o tom, jak se k vašemu REST API ověřit. Pomocí Azure Portalu nebo Microsoft Graphu zaregistrujte aplikaci, aby ověřila vaše vlastní rozšíření ověřování pro funkce Azure.

Registrace vlastního rozšíření ověřování

  1. Přihlaste se k webu Azure Portal jako alespoň správce aplikací a správce ověřování.

  2. Vyhledejte a vyberte Microsoft Entra ID a vyberte Podnikové aplikace.

  3. Vyberte Vlastní rozšíření pro ověřování a pak vyberte Vytvořit vlastní rozšíření.

  4. V části Základy vyberte typ události EmailOtpSend a vyberte Další.

    Snímek obrazovky webu Azure Portal se zvýrazněnou událostí odeslání jednorázového hesla e-mailu

  5. Na kartě Konfigurace koncového bodu vyplňte následující vlastnosti a pokračujte výběrem možnosti Další.

    • Název – název vlastního rozšíření ověřování. Například Odeslat OTP e-mailem.
    • Cílová adresa URL{Function_Url} adresa URL vaší funkce Azure. Přejděte na stránku Přehled aplikace Azure Functions a pak vyberte funkci, kterou jste vytvořili. Na stránce Přehled funkce vyberte Získat adresu URL funkce a pomocí ikony kopírování zkopírujte adresu URL customauthenticationextension_extension (systémový klíč).
    • Popis – popis vlastních rozšíření ověřování.
  6. Na kartě Ověřování rozhraní API vyberte možnost Vytvořit novou registraci aplikace a vytvořte registraci aplikace, která představuje vaši aplikaci funkcí.

  7. Pojmenujte aplikaci, například API pro ověřování Azure Functions, a vyberte Další.

  8. Na kartě Aplikace vyberte aplikaci, kterou chcete přidružit k rozšíření vlastního ověřování. Vyberte Další. Zaškrtnutím políčka ji můžete použít pro celý tenant. Pokračujte výběrem tlačítka Další.

  9. Na kartě Revize zkontrolujte správnost podrobností pro rozšíření vlastního ověřování. Poznamenejte si App ID pod ověřování API, které je potřeba ke konfiguraci ověřování pro vaši funkci Azure ve vaší aplikaci Azure Functions. Vyberte Vytvořit.

Po vytvoření vlastního rozšíření ověřování otevřete aplikaci z portálu v části Registrace aplikací a vyberte oprávnění rozhraní API.

Na stránce oprávnění rozhraní API vyberte tlačítko Udělit souhlas správce pro „YourTenant“, abyste udělili souhlas správce zaregistrované aplikaci, což umožňuje vlastnímu rozšíření ověřování, aby se ověřilo ve vašem rozhraní API. Rozšíření vlastního ověřování používá client_credentials k ověření prostřednictvím oprávnění Receive custom authentication extension HTTP requests v aplikaci Azure Functions.

Následující snímek obrazovky ukazuje, jak udělit oprávnění.

Snímek obrazovky webu Azure Portal a udělení souhlasu správce

Krok 4: Konfigurace aplikace OpenID Connect pro testování pomocí

Pokud chcete získat token a otestovat vlastní rozšíření ověřování, můžete použít https://jwt.ms aplikaci. Jedná se o webovou aplikaci vlastněnou Microsoftem, která zobrazuje dekódovaný obsah tokenu (obsah tokenu nikdy neopustí váš prohlížeč).

Pokud chcete zaregistrovat jwt.ms webovou aplikaci, postupujte takto:

4.1 Registrace testovací webové aplikace

  1. Přihlaste se do Centra pro správu Microsoft Entra jako alespoň správce aplikací.
  2. Přejděte k Identita>Aplikace>Registrace aplikací.
  3. Vyberte Nová registrace.
  4. Zadejte název aplikace. Například Moje testovací aplikace.
  5. V části Podporované typy účtů vyberte Pouze účty v tomto organizačním adresáři.
  6. V rozevíracím seznamu Vybrat platformu pro přesměrování URI vyberte Web, a poté zadejte https://jwt.ms do textového pole pro adresu URL.
  7. Výběrem možnosti Zaregistrovat dokončete registraci aplikace.
  8. V registraci vaší aplikace, v části Přehled, zkopírujte ID aplikace (klienta), které se později používá a označuje jako {App_to_sendotp_ID}. V Microsoft Graphu se na ni odkazuje vlastnost appId .

Následující snímek obrazovky ukazuje, jak zaregistrovat aplikaci My Test.

Snímek obrazovky, který ukazuje způsob výběru podporovaného typu účtu a identifikátoru URI přesměrování.

4.1 Získání ID aplikace

V registraci aplikace zkopírujte v části Přehled ID aplikace (klienta). ID aplikace se označuje jako {App_to_sendotp_ID} v dalších krocích. V Microsoft Graphu se na ni odkazuje vlastnost appId .

4.2 Povolení implicitního toku

Testovací aplikace jwt.ms používá implicitní tok. Povolte implicitní tok v registraci My Test application

Důležitý

Microsoft doporučuje používat nejbezpečnější dostupný tok ověřování. Tok ověřování používaný k testování v tomto postupu vyžaduje velmi vysoký stupeň důvěryhodnosti v aplikaci a nese rizika, která nejsou přítomna v jiných tocích. Tento přístup by se neměl používat k ověřování uživatelů v produkčních aplikacích (další informace).

  1. V části Spravovat vyberte Ověřování.
  2. V části Implicitní udělení a hybridní toky zaškrtněte políčko Tokeny ID (používané pro implicitní a hybridní toky).
  3. Zvolte Uložit.

Krok 5: Ochrana funkce Azure

Rozšíření vlastního ověřování Microsoft Entra používá tok mezi servery k získání přístupového tokenu, který je odeslán v hlavičce HTTP Authorization do vaší funkce Azure. Při publikování funkce do Azure, zejména v produkčním prostředí, je potřeba ověřit token odeslaný v autorizační hlavičce.

Pokud chcete chránit funkci Azure, postupujte podle těchto kroků, abyste integrovali ověřování pomocí Microsoft Entra pro ověřování příchozích tokenů pomocí registrace aplikace pro rozhraní API událostí ověřování služby Azure Functions.

Poznámka:

Pokud je aplikace funkcí Azure hostovaná v jiném klientovi Azure než klient, ve kterém je zaregistrované vlastní rozšíření ověřování, přeskočte na krok použití poskytovatele identity OpenID Connect.

  1. Přihlaste se k portálu Azure.
  2. Přejděte a vyberte aplikaci funkcí, kterou jste předtím publikovali.
  3. V nabídce vlevo vyberte Ověřování .
  4. Vyberte Přidat poskytovatele identity.
  5. V rozevírací nabídce Vyberte Microsoft jako zprostředkovatele identity.
  6. V části Registrace aplikace - Typ registrace aplikace vyberte Vybrat existující registraci aplikace v tomto adresáři a vyberte registraci aplikace API událostí ověřování služby Azure Functions, kterou jste dříve vytvořili při registraci vlastního poskytovatele e-mailu.
  7. Přidejte vypršení platnosti tajného klíče klienta pro aplikaci.
  8. V části Neověřené požadavky vyberte HTTP 401 Neautorizováno jako možnost poskytovatele identity.
  9. Zrušte výběr možnosti Token Store.
  10. Vyberte Přidat pro přidání ověřování do funkce Azure Function.

Snímek obrazovky, který ukazuje, jak přidat ověřování do aplikace funkcí

5.1 Použití zprostředkovatele identity OpenID Connect

Pokud jste nakonfigurovali zprostředkovatele identity Microsoftu, přeskočte tento krok. Jinak platí, že pokud je funkce Azure Functions hostovaná v jiném tenantovi, než je tenant, ve kterém je vaše vlastní rozšíření ověřování zaregistrované, postupujte podle těchto kroků k ochraně vaší funkce:

  1. Přihlaste se k webu Azure Portal a pak přejděte a vyberte aplikaci funkcí, kterou jste předtím publikovali.

  2. V levém podokně vyberte Ověřování .

  3. Vyberte Přidat poskytovatele identity.

  4. Jako zprostředkovatele identity vyberte OpenID Connect .

  5. Zadejte název, například ID Společnosti Contoso Microsoft Entra.

  6. Pod položkou Metadata zadejte následující adresu URL dokumentu do URL dokumentu. Nahraďte {tenantId} ID vašeho tenanta Microsoft Entra a {tenantname} názvem vašeho tenanta bez 'onmicrosoft.com'.

    https://{tenantname}.ciamlogin.com/{tenantId}/v2.0/.well-known/openid-configuration
    
  7. V části Registrace aplikace zadejte ID aplikace (ID klienta) registrace aplikace Azure Functions Authentication Events API, kterou jste vytvořili předtím.

  8. V Centru pro správu Microsoft Entra:

    1. Vyberte registraci aplikace API událostí ověřování Azure Functions, kterou jste vytvořili dříve.
    2. Vyberte Certifikáty a tajemství>Klientská tajemství>Nové klientské tajemství.
    3. Přidejte popis tajného kódu klienta.
    4. Vyberte vypršení platnosti tajného kódu nebo zadejte vlastní životnost.
    5. Vyberte Přidat.
    6. Poznamenejte si hodnotu tajného kódu pro použití v kódu klientské aplikace. Po opuštění této stránky se tento tajný kód už nikdy nezobrazí.
  9. Zpět do funkce Azure Functions v rámci registrace aplikace zadejte tajný klíč klienta.

  10. Zrušte výběr Token store možnosti.

  11. Vyberte Přidat a přidejte zprostředkovatele identity OpenID Connect.

Krok 6: Testování aplikace

Pokud chcete otestovat vlastního poskytovatele e-mailu, postupujte takto:

  1. Otevřete nový privátní prohlížeč a pomocí následující adresy URL přejděte a přihlaste se.

    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. Nahraďte {tenant-id} ID tenanta, název tenanta nebo jeden z ověřených názvů domén. Například contoso.onmicrosoft.com.

  3. Nahraďte {tenantname} názvem vašeho tenanta, přičemž vynechte část 'onmicrosoft.com'.

  4. Nahraďte {App_to_sendotp_ID} identifikačním číslem registrace aplikace "My Test".

  5. Ujistěte se, že se přihlašujete pomocí účtu jednorázového hesla e-mailu. Pak vyberte Odeslat kód. Ujistěte se, že kód odeslaný na registrované e-mailové adresy používá výše zaregistrovaného vlastního poskytovatele.

Krok 7: Vraťte se k poskytovateli Microsoftu

Pokud v rozhraní API rozšíření dojde k chybě, Entra ID uživateli ve výchozím nastavení neodešle jednorázové heslo. Místo toho můžete nastavit chování při chybě tak, aby se vrátilo k poskytovateli od Microsoftu.

Pokud to chcete povolit, spusťte následující požadavek. Nahraďte {customListenerObjectId} s ID vlastního naslouchacího procesu ověřování zaznamenaným dříve.

  • Potřebujete delegovaná oprávnění 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"
            }
        }
    }
}

Viz také