다음을 통해 공유


한 번 암호 보내기 이벤트에 대한 사용자 지정 전자 메일 공급자 구성(미리 보기)

적용 대상: 회색 X 기호가 있는 흰색 원. 인력 테넌트 흰색 확인 표시 기호가 있는 녹색 원 외부 테넌트(자세한 정보)

이 문서에서는 OTP(일회성 암호) 보내기 이벤트 유형에 대한 사용자 지정 전자 메일 공급자를 구성하고 설정하는 방법에 대한 가이드를 제공합니다. 이 이벤트는 OTP 전자 메일이 활성화될 때 트리거되며 REST API를 호출하여 REST API를 호출하여 사용자 고유의 전자 메일 공급자를 사용할 수 있습니다.

지금 체험하기

이 기능을 사용해 보려면 Woodgrove 식료품 데모로 이동하여 "사용자 지정 전자 메일 공급자를 일회성 코드로 사용" 사용 사례를 시작합니다.

필수 조건

1단계: Azure Function 앱 만들기

이 섹션에서는 Azure Portal에서 Azure Function 앱을 설정하는 방법을 보여 줍니다. 함수 API는 전자 메일 공급자에 대한 게이트웨이입니다. HTTP 트리거 함수를 호스트하고 함수에서 설정을 구성하는 Azure Function 앱을 만듭니다.

이 문서의 단계는 시작하는 포털에 따라 약간 다를 수도 있습니다.

  1. 최소한 애플리케이션 관리자인증 관리자Azure Portal에 로그인합니다.

  2. Azure Portal 메뉴 또는 페이지에서 리소스 만들기를 선택합니다.

  3. 함수 앱을 검색하여 선택한 다음 만들기를 선택합니다.

  4. 함수 앱 만들기 페이지에서 소비를 선택한 다음, 선택합니다.

  5. 함수 앱 만들기(소비) 페이지의 기본 사항 탭에서 다음 표에 지정된 대로 설정을 사용하여 함수 앱을 만듭니다.

    설정 제안 값 설명
    구독 구독 새 함수 앱이 만들어지는 구독입니다.
    리소스 그룹 myResourceGroup 필수 구성 요소의 일부로 Azure Communications ServiceEmail Communication Service 리소스를 설정하는 데 사용되는 리소스 그룹을 선택합니다.
    함수 앱 이름 전역적으로 고유한 이름 새 함수 앱을 식별하는 이름입니다. 유효한 문자는 a-z(대/소문자 구분 안 함), 0-9-입니다.
    코드 또는 컨테이너 이미지 배포 코드 코드 파일 또는 Docker 컨테이너를 게시하는 옵션입니다. 이 자습서에서는 코드를 선택합니다.
    런타임 스택 .NET 선호하는 프로그래밍 언어입니다. 이 자습서에서는 .NET을 선택합니다.
    버전 8(LTS) In-process .NET 런타임의 버전입니다. In Process는 포털에서 함수를 만들고 수정할 수 있음을 의미하며 이는 이 가이드에 권장됩니다.
    지역 기본 지역 사용자 또는 함수가 액세스할 수 있는 기타 서비스에 가까운 지역을 선택합니다.
    운영 체제 Windows 운영 체제는 런타임 스택 선택에 따라 미리 선택됩니다.
  6. 검토 + 만들기를 선택하여 앱 구성 선택 항목을 검토한 다음, 만들기를 선택합니다. 배포에는 몇 분 정도 걸립니다.

  7. 배포한 후 리소스로 이동을 선택하여 새 함수 앱을 확인합니다.

1.1 HTTP 트리거 함수 만들기

Azure Function 앱을 만든 후 HTTP 트리거 함수를 만듭니다. HTTP 트리거를 사용하면 HTTP 요청으로 함수를 호출할 수 있습니다. 이 HTTP 트리거는 Microsoft Entra 사용자 지정 인증 확장에서 참조됩니다.

  1. 함수 앱 내의 메뉴에서 함수를 선택합니다.
  2. 함수 만들기를 선택합니다.
  3. 함수 만들기 창의 템플릿 선택에서 HTTP 트리거 템플릿을 검색하여 선택합니다. 다음을 선택합니다.
  4. 템플릿 세부 정보에서 함수 이름 속성에 대한 CustomAuthenticationExtensionsAPI입력합니다.
  5. 권한 부여 수준에서 함수를 선택합니다.
  6. 만들기를 실행합니다.

1.2 함수 편집

코드는 들어오는 JSON 개체를 읽는 것으로 시작합니다. Microsoft Entra ID는 JSON 개체를 API로 보냅니다. 이 예제에서는 전자 메일 주소(식별자) 및 OTP를 읽습니다. 그런 다음, 코드는 동적 템플릿을 사용하여 전자 메일을 보내기 위해 통신 서비스에 세부 정보를 보냅니다.

이 방법 가이드에서는 Azure Communication Services 및 SendGrid를 사용하는 OTP 보내기 이벤트를 보여 줍니다. 탭을 사용하여 구현을 선택합니다.

  1. 메뉴에서 코드 + 테스트를 선택합니다.

  2. 전체 코드를 다음 코드 조각으로 바꿉니다.

    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. 함수 URL 가져오기를 선택하고{Function_Url} 함수를 닫습니다.

2단계: Azure Function에 연결 문자열 추가

연결 문자열을 사용하면 Communication Services SDK가 Azure에 연결하고 인증할 수 있습니다. Azure Communication Services 및 SendGrid의 경우 이러한 연결 문자열 Azure Function 앱에 환경 변수로 추가해야 합니다.

2.1: Azure Communication Services 리소스에서 연결 문자열 및 서비스 엔드포인트 추출

Azure Portal에서 또는 Azure Resource Manager API를 사용하여 프로그래밍 방식으로 Communication Services 연결 문자열 및 서비스 엔드포인트에 액세스할 수 있습니다.

  1. Azure Portal의 페이지에서 포털 메뉴를 열고 모든 리소스를 검색하여 선택합니다.

  2. 이 문서의 필수 구성 요소의 일부로 만든 Azure Communications Service 검색하여 선택합니다.

  3. 왼쪽 창에서 설정 드롭다운을 선택한 다음, 키를 선택합니다.

  4. 엔드포인트를 복사하고 기본 키에서 연결 문자열의 값을 복사합니다.

    엔드포인트 및 키 위치를 보여 주는 Azure Communications Service 키 페이지의 스크린샷.

2.2: Azure Function에 연결 문자열 추가

  1. Azure Function 앱 만들기에서 만든 Azure Function으로 다시 이동합니다.

  2. 함수 앱의 개요 페이지의 왼쪽 메뉴에서 설정>다음 앱 설정을 추가합니다. 모든 설정이 추가되면 적용을 선택한 다음 확인을 선택합니다.

    설정 값(예) 설명
    mail_connectionString https://ciamotpcommsrvc.unitedstates.communication.azure.com/:accesskey=A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u Azure Communication Services 엔드포인트
    mail_sender from.email@myemailprovider.com 보낸 사람 전자 메일 주소입니다.
    mail_subject CIAM 데모 전자 메일의 제목입니다.

3단계: 사용자 지정 인증 확장 등록

이 단계에서는 Microsoft Entra ID가 Azure Function을 호출하는 데 사용하는 사용자 지정 인증 확장을 구성합니다. 사용자 지정 인증 확장에는 REST API 엔드포인트에 대한 정보, REST API에서 구문 분석하는 클레임, REST API에 인증하는 방법이 포함됩니다. Azure Portal 또는 Microsoft Graph를 사용하여 애플리케이션을 등록하여 Azure Function에 대한 사용자 지정 인증 확장을 인증합니다.

사용자 지정 인증 확장 등록

  1. 최소한 애플리케이션 관리자인증 관리자Azure Portal에 로그인합니다.

  2. Microsoft Entra ID를 검색하여 선택하고 엔터프라이즈 애플리케이션을 선택합니다.

  3. 사용자 지정 인증 확장을 선택한 다음 사용자 지정 확장 만들기를 선택합니다.

  4. 기본 사항에서 EmailOtpSend 이벤트 유형을 선택하고 다음을 선택합니다.

    이메일 OTP 보내기 이벤트를 강조 표시하는 Azure Portal의 스크린샷.

  5. 엔드포인트 구성 탭에서 다음 속성을 입력한 다음 다음을 선택하여 계속합니다.

    • 이름 - 사용자 지정 인증 확장의 이름입니다. 예를 들어 전자 메일 OTP 보내기입니다.
    • 대상 URL - Azure 함수 URL의 {Function_Url}입니다. Azure 함수 앱의 개요 페이지로 이동한 다음 만든 함수를 선택합니다. 함수 개요 페이지에서 함수 URL 가져오기를 선택하고 복사 아이콘을 사용하여 customauthenticationextension_extension(시스템 키) URL을 복사합니다.
    • 설명 - 사용자 지정 인증 확장에 대한 설명입니다.
  6. API 인증 탭에서 새 앱 등록 만들기 옵션을 선택하여 함수 앱을 나타내는 앱 등록을 만듭니다.

  7. 앱에 이름(예: Azure Functions 인증 이벤트 API)을 지정하고 다음을 선택합니다.

  8. 애플리케이션 탭에서 사용자 지정 인증 확장과 연결할 애플리케이션을 선택합니다. 다음을 선택합니다. 확인란을 선택하여 전체 테넌트에 적용할 수 있습니다. 다음을 선택하여 작업을 계속할 수 있습니다.

  9. 검토 탭에서 사용자 지정 인증 확장에 대한 세부 정보가 올바른지 확인합니다. Azure 함수 앱에서 Azure 함수에 대한 인증을 구성하는 데 필요한 API 인증 아래의 앱 ID를 확인합니다. 만들기를 실행합니다.

사용자 지정 인증 확장을 만든 후 앱 등록 아래의 포털에서 애플리케이션을 열고 API 권한을 선택합니다.

API 권한 페이지에서 "YourTenant" 단추에 대한 관리자 동의 부여를 선택하여 등록된 앱에 대한 관리자 동의를 부여합니다. 그러면 사용자 지정 인증 확장에서 API에 인증할 수 있습니다. 사용자 지정 인증 확장은 client_credentialsReceive custom authentication extension HTTP requests 권한을 사용하여 Azure 함수 앱을 인증합니다.

다음 스크린샷은 권한 부여하는 방법을 보여 줍니다.

Azure Portal 및 관리자 동의를 부여하는 방법의 스크린샷.

4단계: 테스트할 OpenID Connect 앱 구성

토큰을 가져와서 사용자 지정 인증 확장을 테스트하려면 https://jwt.ms 앱을 사용하면 됩니다. 토큰의 디코딩된 콘텐츠를 표시하는 Microsoft 자체 웹 애플리케이션입니다(토큰의 콘텐츠는 브라우저를 떠나지 않음).

다음 단계에 따라 jwt.ms 웹 애플리케이션을 등록합니다.

4.1 테스트 웹 애플리케이션 등록

  1. 최소한 애플리케이션 관리자 자격으로 Microsoft Entra 관리 센터에 로그인합니다.
  2. ID>애플리케이션>애플리케이션 등록으로 이동합니다.
  3. 새 등록을 선택합니다.
  4. 애플리케이션의 이름을 입력합니다. 예를 들어 내 테스트 애플리케이션입니다.
  5. 지원되는 계정 유형에서 이 조직 디렉터리의 계정만을 선택합니다.
  6. 리디렉션 URI의 플랫폼 선택 드롭다운에서 https://jwt.ms
  7. 등록을 선택하여 앱 등록을 완료합니다.
  8. 앱 등록의 개요에서 나중에 사용되고 라고 하는 애플리케이션(클라이언트) ID{App_to_sendotp_ID}합니다. Microsoft Graph에서는 appId 속성으로 참조됩니다.

다음 스크린샷에서는 내 테스트 애플리케이션을 등록하는 방법을 보여 줍니다.

지원되는 계정 유형 및 리디렉션 URI를 선택하는 방법을 보여 주는 스크린샷

4.1 애플리케이션 ID 가져오기

앱 등록의 개요에서 애플리케이션(클라이언트) ID를 복사합니다. 이후 단계에서 앱 ID를 {App_to_sendotp_ID}라고 합니다. Microsoft Graph에서는 appId 속성으로 참조됩니다.

4.2 암시적 흐름 사용

jwt.ms 테스트 애플리케이션은 암시적 흐름을 사용합니다. 내 테스트 애플리케이션 등록에서 암시적 흐름을 사용하도록 설정합니다.

  1. 관리에서 인증을 선택합니다.
  2. 암시적 허용 및 하이브리드 흐름 아래에서 ID 토큰(암시적 및 하이브리드 흐름에 사용됨) 확인란을 선택합니다.
  3. 저장을 선택합니다.

참고 항목

jwt.ms 앱은 암시적 흐름을 사용하여 ID 토큰을 가져오며 테스트 목적으로만 사용됩니다. 프로덕션 애플리케이션에는 암시적 흐름이 권장되지 않습니다. 프로덕션 애플리케이션의 경우 권한 부여 코드 흐름을 사용합니다.

5단계: Azure Function 보호

Microsoft Entra 사용자 지정 인증 확장은 서버 간 흐름을 사용하여 HTTP Authorization 헤더에서 Azure Function으로 보내는 액세스 토큰을 가져옵니다. 특히 프로덕션 환경에서 Azure에 함수를 게시할 때 권한 부여 헤더에서 보낸 토큰의 유효성을 검사해야 합니다.

Azure Function을 보호하려면 다음 단계에 따라 들어오는 토큰의 유효성을 검사하기 위해 Azure Functions 인증 이벤트 API 애플리케이션 등록과 Microsoft Entra 인증을 통합합니다.

참고 항목

Azure 함수 앱이 사용자 지정 인증 확장이 등록된 테넌트가 아닌 다른 Azure 테넌트에서 호스트되는 경우 OpenID Connect ID 공급자 사용 단계로 건너뜁니다.

  1. Azure Portal에 로그인합니다.
  2. 이전에 게시한 함수 앱으로 이동하여 선택합니다.
  3. 왼쪽 메뉴에서 인증을 선택합니다.
  4. ID 공급자 추가를 선택합니다.
  5. 드롭다운 메뉴에서 Microsoft를 ID 공급자로 선택합니다.
  6. 앱 등록-앱 등록 유형에서 >에서 기존 앱 등록을 선택하고 사용자 지정 전자 메일 공급자를 등록할 때 이전에 만든 Azure Functions 인증 이벤트 API 앱 등록을 선택합니다.
  7. 앱에 대한 클라이언트 비밀 만료를 추가합니다.
  8. 인증되지 않은 요청에서 ID 공급자로 HTTP 401 권한 없음을 선택합니다.
  9. 토큰 저장소 옵션을 선택 취소합니다.
  10. 추가를 선택하여 Azure Function에 인증을 추가합니다.

함수 앱에 인증을 추가하는 방법을 보여 주는 스크린샷

5.1 OpenID Connect ID 공급자 사용

Microsoft ID 공급자를 구성한 경우 이 단계를 건너뜁니다. 그러지 않으면 Azure Function이 사용자 지정 인증 확장이 등록된 테넌트와 다른 테넌트에서 호스트되는 경우 다음 단계에 따라 함수를 보호합니다.

  1. Azure Portal에 로그인한 다음 이전에 게시한 함수 앱으로 이동하여 선택합니다.

  2. 왼쪽 창에서 인증을 선택합니다.

  3. ID 공급자 추가를 선택합니다.

  4. ID 공급자로 OpenID Connect를 선택합니다.

  5. Contoso Microsoft Entra ID와 같은 이름을 제공합니다.

  6. 메타데이터 항목에서 문서 URL에 다음 URL을 입력합니다. {tenantId} Microsoft Entra 테넌트 ID {tenantname} 로 바꾸고 'onmicrosoft.com'이 없는 테넌트의 이름으로 바꿉니다.

    https://{tenantname}.ciamlogin.com/{tenantId}/v2.0/.well-known/openid-configuration
    
  7. 앱 등록에서 이전에 만든 Azure Functions 인증 이벤트 API 앱 등록의 애플리케이션 ID(클라이언트 ID)를 입력합니다.

  8. Microsoft Entra 관리 센터에서 다음을 수행합니다.

    1. 이전에 만든 Azure Functions 인증 이벤트 API 앱 등록을 선택합니다.
    2. 인증서 및 비밀>클라이언트 암호>새 클라이언트 암호를 선택합니다.
    3. 클라이언트 비밀에 대한 설명을 추가합니다.
    4. 암호에 대해 만료를 선택하거나 사용자 지정 수명을 지정합니다.
    5. 추가를 선택합니다.
    6. 클라이언트 애플리케이션 코드에서 사용할 비밀 을 기록합니다. 이 비밀 값은 이 페이지에서 나가면 다시 표시되지 않습니다.
  9. Azure 함수로 돌아간 후, 앱 등록에서 클라이언트 암호를 입력합니다.

  10. 토큰 저장소 옵션을 선택 취소합니다.

  11. 추가를 선택하여 OpenID Connect ID 공급자를 추가합니다.

6단계: 애플리케이션 테스트

사용자 지정 전자 메일 공급자를 테스트하려면 다음 단계를 수행합니다.

  1. 새 프라이빗 브라우저를 열고 다음 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
    
  2. {tenant-id}를 테넌트 ID, 테넌트 이름 또는 확인된 도메인 이름 중 하나로 바꿉니다. 예들 들어 contoso.onmicrosoft.com입니다.

  3. 'onmicrosoft.com'이 없는 테넌트의 이름으로 바꿉 {tenantname} 있습니다.

  4. {App_to_sendotp_ID}내 테스트 애플리케이션 등록 ID로 바꿉니다.

  5. 이메일 일회용 암호 계정을 사용하여 로그인해야 합니다. 그런 다음, 코드 보내기를 선택합니다. 등록된 전자 메일 주소로 전송된 코드에서 위에 등록된 사용자 지정 공급자를 사용하는지 확인합니다.

7단계: Microsoft 공급자로 대체

확장 API 내에서 오류가 발생하면 기본적으로 Entra ID는 사용자에게 OTP를 보내지 않습니다. 대신 오류 시 동작을 Microsoft 공급자로 대체하도록 설정할 수 있습니다.

이를 사용하도록 설정하려면 다음 요청을 실행합니다. 이전에 기록된 사용자 지정 인증 수신기 ID로 바꿉 {customListenerOjectId} 니다.

  • 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"
            }
        }
    }
}

참고 항목