Een aangepaste e-mailprovider configureren voor eenmalige wachtwoordcode voor het verzenden van gebeurtenissen (preview)
Van toepassing op: Werknemer tenants
Externe tenants (meer informatie)
Dit artikel bevat een handleiding voor het configureren en instellen van een aangepaste e-mailprovider voor het gebeurtenistype Eenmalige wachtwoordcode (OTP). De gebeurtenis wordt geactiveerd wanneer een OTP-e-mail wordt geactiveerd. Hiermee kunt u een REST API aanroepen om uw eigen e-mailprovider te gebruiken door een REST API aan te roepen.
Tip
Als u deze functie wilt uitproberen, gaat u naar de Woodgrove Boodschappendemo en start u de use case 'Een aangepaste e-mailprovider gebruiken voor eenmalige code'.
Vereisten
- Vertrouwd zijn met en begrip van de concepten in aangepaste verificatie-extensies.
- Een Azure-abonnement. Als u geen bestaand Azure-account hebt, meldt u zich aan voor een gratis proefversie of gebruikt u de voordelen van uw Visual Studio-abonnement wanneer u een account maakt.
- Een externe tenant van Microsoft Entra ID.
- Voor Azure Communications Services-gebruikers;
- Een Azure Communications Services-resource. Als u er nog geen hebt, maakt u er een in Quickstart: Create and manage Communication Services resources met behulp van een nieuwe of bestaande resourcegroep.
- Een Azure Email Communication Services-resource die is gemaakt en klaar is voor gebruik met een ingericht domein. Als u er nog geen hebt, raadpleegt u Quickstart: E-mailcommunicatieserviceresources maken en beheren, en gebruikt u dezelfde resourcegroep als de Azure Communication Services.
- Een actieve Communication Services-resource die is verbonden met een e-maildomein. Raadpleeg de quickstart: Verbinding maken met een geverifieerd e-maildomein
- (Optioneel) Verzend een e-mailbericht met Behulp van Azure Communication Services om het verzenden van e-mailberichten naar de gewenste geadresseerden te testen met behulp van Azure Communication Services, terwijl u de configuratie voor uw toepassing controleert om e-mail te verzenden.
- Voor SendGrid-gebruikers:
- Een SendGrid-account. Als u er nog geen hebt, begint u met het instellen van een SendGrid-account. Zie de sectie Een SendGrid-account maken voor instructies voor het verzenden van e-mail met SendGrid met Azure.
Stap 1: Een Azure Function-app maken
In deze sectie wordt beschreven hoe u een Azure Function-app instelt in Azure Portal. De functie-API is de gateway naar uw e-mailprovider. U maakt een Azure Function-app om de HTTP-triggerfunctie te hosten en de instellingen in de functie te configureren.
Tip
Stappen in dit artikel kunnen enigszins variëren op basis van de portal waaruit u begint.
Meld u aan bij Azure Portal als ten minste een toepassingsbeheerder en verificatiebeheerder.
Selecteer vanuit het menu van Azure Portal of op de startpagina de optie Een resource maken.
Zoek en selecteer Functie-app en selecteer Maken.
Op de pagina Functie-app maken selecteer je Verbruik en klik vervolgens op Selecteren.
Maak op de pagina Functie-app maken (Verbruik) op het tabblad Basisbeginselen een functie-app met behulp van de instellingen die zijn opgegeven in de volgende tabel:
Instelling Voorgestelde waarde Beschrijving Abonnement Uw abonnement Het abonnement waaronder de nieuwe functie-app wordt gemaakt. Resourcegroep myResourceGroup Selecteer de resourcegroep die wordt gebruikt voor het instellen van de Azure Communications Service- en E-mailcommunicatieserviceresources als onderdeel van de vereisten Naam van de functie-app Wereldwijd unieke naam Een naam die de nieuwe functie-app identificeert. Geldige tekens zijn a-z
(niet hoofdlettergevoelig),0-9
en-
.Code of containerafbeelding implementeren Code Optie voor het publiceren van codebestanden of een Docker-container. Voor deze zelfstudie selecteert u Code. Runtime-stack .NET Uw favoriete programmeertaal. Voor deze zelfstudie selecteert u .NET. Versie 8 (LTS) In-proces Versie van de .NET-runtime. In-process geeft aan dat u functies in de portal kunt maken en wijzigen. Dit wordt aanbevolen voor deze handleiding Regio Voorkeursregio Selecteer een regio in de buurt of in de buurt van andere services waartoe uw functies toegang hebben. Besturingssysteem Windows Het besturingssysteem is vooraf geselecteerd op basis van de selectie van uw runtime-stack. Selecteer Beoordelen en Maken om de app-configuratieselecties te controleren en selecteer vervolgens Maken. De implementatie duurt een paar minuten.
Nadat deze is geïmplementeerd, selecteert u Ga naar de resource om uw nieuwe functie-app te bekijken.
1.1 Een HTTP-triggerfunctie maken
Nadat de Azure Function-app is gemaakt, maakt u een HTTP-triggerfunctie. Met de HTTP-trigger kunt u een functie aanroepen met een HTTP-aanvraag. Deze HTTP-trigger wordt verwezen door de aangepaste verificatie-extensie van Microsoft Entra.
- Selecteer Functies in het menu van uw functie-app.
- Selecteer Functie maken.
- In het venster Functie maken, onder Een sjabloon selecteren, zoek de HTTP-triggersjabloon en selecteer deze. Selecteer Volgende.
- Voer onder Sjabloondetails CustomAuthenticationExtensionsAPI in voor de eigenschap Functienaam.
- Selecteer Functie voor het autorisatieniveau.
- Selecteer Aanmaken.
1.2 De functie bewerken
De code begint met het lezen van het binnenkomende JSON-object. Microsoft Entra ID verzendt het JSON-object naar uw API. In dit voorbeeld worden het e-mailadres (id) en de OTP gelezen. Vervolgens verzendt de code de details naar de communicatieservice om het e-mailbericht te verzenden met behulp van een dynamische sjabloon.
In deze handleiding wordt de OTP-verzendgebeurtenis gedemonstreert met behulp van Azure Communication Services en SendGrid. Gebruik de tabbladen om uw implementatie te selecteren.
Selecteer Code + Test in het menu.
Vervang de hele code door het volgende codefragment.
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>"; } } }
Selecteer Functie-URL ophalen en kopieer de URL van de functiesleutel, die voortaan wordt gebruikt en waarnaar wordt verwezen als
{Function_Url}
. Sluit de functie.
Stap 2: verbindingsreeks s toevoegen aan de Azure-functie
Met verbindingsreeksen kunnen de Communication Services-SDK's verbinding maken en verifiëren bij Azure. Voor zowel Azure Communication Services als SendGrid moet u deze verbindingsreeks s als omgevingsvariabelen toevoegen aan uw Azure Function-app.
2.1: Extraheer de verbindingsreeks en service-eindpunten uit je Azure Communication Services-resource
U hebt toegang tot uw verbindingsreeksen voor Communication Services en service-eindpunten van de Azure Portal of programmatisch met Azure Resource Manager-API‘s
Open op de startpagina in Azure Portal het portalmenu, zoek en selecteer Alle resources.
Zoek en selecteer de Azure Communications Service die is gemaakt als onderdeel van de vereisten voor dit artikel.
Selecteer in het linkerdeelvenster de Instellingen-dropdown en selecteer vervolgens Sleutels.
Kopieer het eindpunt en kopieer de waarden van de primaire sleutel voor sleutel en verbindingsreeks.
2.2: Voeg de verbindingsreeksen toe aan de Azure Function
Ga terug naar de Azure-functie die u hebt gemaakt in Een Azure Function-app maken.
Ga naar de Overzicht pagina van uw functie-app, selecteer in het linkermenu Instellingen>Omgevingsvariabelen en voeg de volgende app-instellingen toe. Zodra alle instellingen zijn toegevoegd, selecteert u Toepassen en bevestigt u het.
Instelling Waarde (voorbeeld) Beschrijving mail_connectionString https://ciamotpcommsrvc.unitedstates.communication.azure.com/:accesskey=A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u
Het Azure Communication Services-eindpunt mail_sender from.email@myemailprovider.com Het afzender-e-mailadres. mail_subject CIAM-demo Het onderwerp van het e-mailbericht.
Stap 3: Een aangepaste verificatie-extensie registreren
In deze stap configureert u een aangepaste verificatie-extensie, die door Microsoft Entra ID wordt gebruikt om uw Azure-functie aan te roepen. De aangepaste verificatie-extensie bevat informatie over uw REST API-eindpunt, de claims die worden geparseerd vanuit uw REST API en hoe u zich kunt verifiëren bij uw REST API. Gebruik Azure Portal of Microsoft Graph om een toepassing te registreren om uw aangepaste verificatie-extensie te verifiëren bij uw Azure-functie.
Een aangepaste verificatie-extensie registreren
Meld u aan bij Azure Portal als ten minste een toepassingsbeheerder en verificatiebeheerder.
Zoek en selecteer Microsoft Entra-id en selecteer Bedrijfstoepassingen.
Selecteer Aangepaste verificatie-extensies en selecteer vervolgens Een aangepaste extensie maken.
Selecteer in Basisinformatie het gebeurtenistype EmailOtpSend en selecteer Volgende.
Vul op het tabblad Eindpuntconfiguratie de volgende eigenschappen in en selecteer vervolgens Volgende om door te gaan.
- Naam : een naam voor uw aangepaste verificatie-extensie. Bijvoorbeeld Email OTP Verzenden.
-
Doel-URL : de
{Function_Url}
URL van uw Azure-functie. Ga naar de pagina Overzicht van uw Azure Function-app en selecteer vervolgens de functie die u hebt gemaakt. Op de pagina Overzicht, selecteer Functie-URL ophalen en gebruik het kopieerpictogram om de URL van de customauthenticationextension_extension (Systeemsleutel) te kopiëren. - Beschrijving : een beschrijving voor uw aangepaste verificatie-extensies.
Selecteer op het tabblad API-verificatie de optie Nieuwe app-registratie maken om een app-registratie te maken die uw functie-app vertegenwoordigt.
Geef de app een naam, bijvoorbeeld azure Functions-verificatie-gebeurtenissen-API, en selecteer Volgende.
Selecteer op het tabblad Toepassingen de toepassing die u wilt koppelen aan de aangepaste verificatie-extensie. Selecteer Volgende. U hebt de mogelijkheid om deze toe te passen op de hele tenant door het selectievakje in te schakelen. Selecteer Volgende om door te gaan.
Controleer op het tabblad Controleren of de details juist zijn voor de aangepaste verificatie-extensie. Noteer de app-id onder API-verificatie, die nodig is voor het configureren van verificatie voor uw Azure-functie in uw Azure Function-app. Selecteer Maken.
Beheerderstoestemming verlenen
Nadat uw aangepaste verificatie-extensie is gemaakt, opent u de toepassing in de portal onder App-registraties en selecteert u API-machtigingen.
Selecteer op de pagina API-machtigingen de knop Beheerderstoestemming verlenen voor YourTenant om beheerderstoestemming te geven aan de geregistreerde app, zodat de aangepaste verificatie-extensie kan worden geverifieerd bij uw API. De aangepaste verificatie-extensie gebruikt client_credentials
voor verificatie bij de Azure Function-app met behulp van de Receive custom authentication extension HTTP requests
machtiging.
In de volgende schermopname ziet u hoe u machtigingen kunt verlenen.
Stap 4: Een OpenID Connect-app configureren om te testen met
Als u een token wilt ophalen en de aangepaste verificatie-extensie wilt testen, kunt u de https://jwt.ms app gebruiken. Het is een webtoepassing van Microsoft die de gedecodeerde inhoud van een token weergeeft (de inhoud van het token verlaat uw browser nooit).
Volg deze stappen om de jwt.ms-webtoepassing te registreren:
4.1 Een testwebtoepassing registreren
- Meld u aan bij het Microsoft Entra-beheercentrum als ten minste een Toepassingsbeheerder.
- Navigeer naar Identiteit>Toepassingen>Toepassingregistraties.
- Selecteer Nieuwe registratie.
- Voer een naam in voor de toepassing. Bijvoorbeeld mijn testtoepassing.
- Onder Ondersteunde accounttypen selecteert u Enkel accounts in deze organisatieadreslijst.
- Selecteer Web in de vervolgkeuzelijst Een platform selecteren in Redirect URI, en voer
https://jwt.ms
in het tekstvak URL in. - Selecteer Registreren om de app-registratie te voltooien.
- Kopieer in uw app-registratie onder Overzicht de toepassings-id (client), die later wordt gebruikt en wordt aangeduid als de .
{App_to_sendotp_ID}
In Microsoft Graph wordt ernaar verwezen door de eigenschap appId .
In de volgende schermopname ziet u hoe u de toepassing Mijn test registreert.
4.1 De toepassings-id ophalen
Kopieer in de app-registratie onder Overzicht de toepassings-id (client). De app-id wordt in latere stappen aangeduid als de {App_to_sendotp_ID}
id. In Microsoft Graph wordt ernaar verwezen door de eigenschap appId .
4.2 Impliciete stroom inschakelen
De jwt.ms testtoepassing maakt gebruik van de impliciete stroom. Impliciete stroom inschakelen in de registratie van mijn testtoepassing :
Belangrijk
Microsoft raadt aan de veiligste verificatiestroom te gebruiken die beschikbaar is. De verificatiestroom die wordt gebruikt voor het testen in deze procedure vereist een zeer hoge mate van vertrouwen in de toepassing en brengt risico's met zich mee die niet aanwezig zijn in andere stromen. Deze benadering mag niet worden gebruikt voor het verifiëren van gebruikers voor uw productie-apps (meer informatie).
- Onder Beheren selecteer Verificatie.
- Schakel onder Impliciete toekenning en hybride stromen het selectievakje ID-tokens (gebruikt voor impliciete en hybride stromen) in.
- Selecteer Opslaan.
Stap 5: Uw Azure-functie beveiligen
De aangepaste verificatie-extensie van Microsoft Entra maakt gebruik van server-naar-serverstroom om een toegangstoken te verkrijgen dat in de HTTP-header naar uw Azure-functie Authorization
wordt verzonden. Wanneer u uw functie publiceert naar Azure, met name in een productieomgeving, moet u het token valideren dat is verzonden in de autorisatieheader.
Als u uw Azure-functie wilt beveiligen, volgt u deze stappen om Microsoft Entra-verificatie te integreren, voor het valideren van binnenkomende tokens met de registratie van uw API-toepassingsregistratie voor Azure Functions-verificatie-gebeurtenissen.
Notitie
Als de Azure-functie-app wordt gehost in een andere Azure-tenant dan de tenant waarin uw aangepaste authenticatie-extensie is geregistreerd, sla dan verder naar de stap OpenID Connect-identiteitsprovider.
- Meld u aan bij het Azure-portaal.
- Navigeer en selecteer de functie-app die u eerder hebt gepubliceerd.
- Selecteer Verificatie in het menu links.
- Selecteer Id-provider toevoegen.
- Selecteer Microsoft als id-provider in de vervolgkeuzelijst.
- Selecteer onder App-registratie-App-registratietype> een bestaande app-registratie in deze map en kies de API-app-registratie voor Azure Functions-verificatiegebeurtenissen die u eerder hebt gemaakt bij het registreren van de aangepaste e-mailprovider.
- Voeg het verlooptijd van het clientgeheim voor de app toe.
- Selecteer onder Niet-geverifieerde aanvragen HTTP 401 Niet geautoriseerd als id-provider.
- Hef de selectie van de tokenopslagoptie op.
- Selecteer Toevoegen om verificatie toe te voegen aan uw Azure-functie.
5.1 Gebruik maken van OpenID Connect-identiteitsprovider
Als u de Microsoft-id-provider hebt geconfigureerd, slaat u deze stap over. Als de Azure-functie wordt gehost onder een andere tenant dan de tenant waarin uw aangepaste verificatie-extensie is geregistreerd, volgt u deze stappen om uw functie te beveiligen:
Meld u aan bij Azure Portal en navigeer en selecteer de functie-app die u eerder hebt gepubliceerd.
Selecteer Verificatie in het linkerdeelvenster.
Selecteer Id-provider toevoegen.
Selecteer OpenID Connect als id-provider.
Geef een naam op, zoals Contoso Microsoft Entra ID.
Voer onder de Metagegeven invoer de volgende URL als document-URL in. Vervang de
{tenantId}
door uw Microsoft Entra-tenant-id en{tenantname}
door de naam van uw tenant zonder de 'onmicrosoft.com'.https://{tenantname}.ciamlogin.com/{tenantId}/v2.0/.well-known/openid-configuration
Voer onder de app-registratie de toepassings-id (client-id) in van de app-registratie voor de Azure Functions-verificatiegebeurtenissen-APIdie u eerder hebt gemaakt.
In het Microsoft Entra-beheercentrum:
- Selecteer de Azure Functions-verificatiegebeurtenissen API-appregistratiedie u eerder hebt gemaakt.
- Selecteer
Certificaten & geheimen Clientgeheimen Nieuw clientgeheim . - Voeg een beschrijving voor uw clientgeheim toe.
- Selecteer een vervaldatum voor het geheim of geef een aangepaste levensduur op.
- Selecteer Toevoegen.
- Noteer de waarde van het geheim voor gebruik in uw clienttoepassingscode. Deze geheimwaarde wordt nooit meer weergegeven nadat u deze pagina hebt verlaten.
Ga terug naar de Azure-functie en voer onder de app-registratie het clientgeheim in.
Hef de selectie van de tokenopslagoptie op.
Selecteer Toevoegen om de OpenID Connect-id-provider toe te voegen.
Stap 6: De toepassing testen
Voer de volgende stappen uit om uw aangepaste e-mailprovider te testen:
Open een nieuwe privébrowser en navigeer en meld u aan via de volgende URL.
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
Vervang door
{tenant-id}
uw tenant-id, tenantnaam of een van uw geverifieerde domeinnamen. Bijvoorbeeld:contoso.onmicrosoft.com
.Vervang
{tenantname}
door de naam van uw tenant zonder de 'onmicrosoft.com'.Vervang
{App_to_sendotp_ID}
door de registratie-id van de toepassing 'My Test'.Zorg ervoor dat u zich aanmeldt met een account voor eenmalige inlogcodes per e-mail. Vervolgens Code verzenden selecteren. Zorg ervoor dat de code die naar de geregistreerde e-mailadressen wordt verzonden, gebruikmaakt van de hierboven geregistreerde aangepaste provider.
Stap 7: terugvallen op Microsoft Provider
Als er een fout optreedt in uw extensie-API, verzendt Entra-id standaard geen OTP naar de gebruiker. U kunt het gedrag bij een fout instellen om terug te vallen op de Microsoft-provider.
Voer de volgende aanvraag uit om dit in te schakelen. Vervang door {customListenerObjectId}
de aangepaste verificatielistener-id die eerder is vastgelegd.
- U hebt de gedelegeerde machtiging EventListener.ReadWrite.All nodig.
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"
}
}
}
}