다음을 통해 공유


양식 제출 유효성 검사 사용자 지정

마케팅 및 이벤트 등록 양식의 클라이언트 측 유효성 검사는 고객이 제출한 데이터의 유효성을 보장하는 데 도움이 됩니다. 그러나 경우에 따라 더 복잡한 유효성 검사가 필요할 수 있습니다. 예를 들어, 제출된 데이터를 시스템에 이미 존재하는 데이터와 비교해야 할 수 있습니다. 복잡한 유효성 검사를 용이하게 하기 위해 이 문서에서는 백엔드에서 제출된 데이터의 유효성을 검사하고 추가 데이터 처리 논리를 트리거하는 사용자 지정 플러그인을 빌드하는 방법을 자세히 설명합니다.

플러그 인 만들기

참고

이 사용자 지정 플러그 인의 예는 reCAPTCHA 키에 대한 백엔드 유효성 검사를 빌드하는 방법을 보여줍니다. 유효성 검사 흐름에 대한 영감으로 사용할 수 있습니다. 양식에 reCAPTCHA를 통합하려면 사전 빌드된 플러그 인을 사용하고 이 가이드를 따르세요.

플러그 인용 Visual Studio 프로젝트 만들기

  1. Visual Studio를 열고 .NET Framework 4.6.2를 사용하여 새 클래스 라이브러리 프로젝트를 만듭니다.
  2. 솔루션 탐색기에서 NuGet 패키지 관리를 선택하고 Microsoft.CrmSdk.CoreAssemblies를 설치합니다.

플러그 인 클래스 만들기

  1. Class1.cs의 이름을 CustomValidationPlugin.cs로 바꿉니다.

  2. CustomValidationPlugin 클래스가 IPlugin 인터페이스에서 상속되도록 만들고 실행 메서드를 추가합니다.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. 컨텍스트 및 추적 서비스를 검색하려면 execute 메서드에 다음 코드를 추가합니다.

    public void Execute(IServiceProvider serviceProvider)
    {
       // get tracing service
       ITracingService tracingService =
       (ITracingService)serviceProvider.GetService(typeof(ITracingService));
    
       // get plugin execution context
       IPluginExecutionContext context = (IPluginExecutionContext)
       serviceProvider.GetService(typeof(IPluginExecutionContext));
    }
    
  4. 이 코드를 추가하여 양식 제출 매개 변수 문자열을 검색하십시오. 사용자가 양식에서 제출한 필드를 나타내는 JSON 인코딩 문자열입니다. 이 프로세스에서는 문자열을 검색하고 역직렬화 도우미 메서드와 나중에 정의되는 FormSubmissionRequest 클래스를 사용하여 역직렬화합니다. 이 코드는 fields 배열에 g-recaptcha-response에 대한 키가 포함되어 있는지 확인합니다. reCAPTCHA 키를 찾을 수 없는 경우 처리 중인 양식에 recaptcha 요소가 포함되어 있지 않으므로 유효성 검사를 건너뜁니다.

    var requestString = (string)context.InputParameters["msdynmkt_formsubmissionrequest"];
    var requestObject = Deserialize<FormSubmissionRequest>(requestString);
    if (!requestObject.Fields.TryGetValue("g-recaptcha-response", out string recaptchaToken))
    {
       tracingService.Trace("g-recaptcha-response was not present in form submission");
       return;
    }
    
  5. g-recaptcha-token 값이 null이거나 비어 있는 경우 반환하려면 다음 코드를 추가합니다.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. 다음 코드를 추가하여 Google API에 대해 Google 캡차 토큰의 유효성을 검사합니다.

    string url = "https://www.google.com/recaptcha/api/siteverify";
    using (HttpClient client = new HttpClient())
    {
       var content = new FormUrlEncodedContent(new Dictionary<string, string>
       {
          {"secret", "your_secret_key"},
          {"response", recaptchaToken}
       });
    
       try
       {
          var response = client.PostAsync(url, content).Result;
          if (!response.IsSuccessStatusCode)
          {
             tracingService.Trace($"Request Failed: ({response.StatusCode}){response.Content}");
             return;
          }
    
          var responseString = response.Content.ReadAsStringAsync().Result;
    
          gRecaptchaResponse = Deserialize<GRecaptchaResponse>(responseString);
    
          var resp = new ValidateFormSubmissionResponse()
          {
             IsValid = isValid,
             ValidationOnlyFields = new List<string>() { "g-recaptcha-response" }
          };
          context.OutputParameters["msdynmkt_validationresponse"] = Serialize(resp);
        }
        catch (Exception e)
        {
           tracingService.Trace($"{e.Message}");
        }
    }
    

    먼저 URL이 정의된 다음 HttpClient의 인스턴스가 생성됩니다. 이전 단계에서 검색된 recaptchaToken과 Google에서 제공한 비밀 키를 포함하는 FormUrlEncodedContent 개체가 생성됩니다. 그런 다음 POST 요청이 전송되고 상태 코드가 확인되며 성공하지 못하면 반환됩니다. 성공하면 역직렬화 도우미 메서드와 나중에 정의되는 GRecaptchaResponse를 사용하여 응답을 역직렬화합니다. 그런 다음 새 ValidateFormSubmissionResponse 개체를 만들고 직렬화한 다음 제출을 수락하거나 거부하는 데 사용하는 하나의 Microsoft 서비스인 출력 매개 변수 msdynmkt_validationresponse의 값으로 설정합니다. g-recaptcha-response 문자열을 ValidationOnlyFields 목록에 추가하면 사용자 인터페이스의 양식 제출에서 해당 필드가 숨겨집니다.

  7. 다음 코드를 추가하여 직렬화 및 역직렬화 도우미 메서드를 정의합니다.

    private T Deserialize<T>(string jsonString)
    {
       serializer = new DataContractJsonSerializer(typeof(T));
       T result;
       using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
       {
          result = (T)serializer.ReadObject(stream);
       }
       return result;
    }
    
    private string Serialize<T>(T obj)
    {
        string result;
        serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream memoryStream = new MemoryStream())
        {
           serializer.WriteObject(memoryStream, obj);
           result = Encoding.Default.GetString(memoryStream.ToArray());
        }
        return result;
    }
    
  8. 다음 코드를 추가하여 JSON 문자열 개체를 직렬화 및 역직렬화하는 데 필요한 클래스를 정의합니다.

    public class FormSubmissionRequest
     {
         public Dictionary<string, string> Fields { get; set; }
     }
    
     public class GRecaptchaResponse
     {
         public bool success { get; set; }
     }
    
     public class ValidateFormSubmissionResponse
     {
         public bool IsValid { get; set; }
         public List<string> ValidationOnlyFields { get; set; }
     }
    

플러그 인 서명 및 빌드

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 솔루션 탐색기에서 속성을 선택합니다.
  2. 서명 탭을 선택하고 어셈블리 서명 확인란을 선택합니다.
  3. <New...>를 선택합니다.
  4. 키 파일 이름을 입력하고 암호로 내 키 파일 보호를 선택 취소합니다.
  5. 프로젝트를 빌드합니다.
  6. 플러그 인 어셈블리 CustomValidationPlugin.dll\bin\Debug에서 확인할 수 있습니다.

플러그 인 등록

  1. PluginRegistration.exe을(를) 여십시오.
  2. 새 연결 만들기를 선택합니다.
  3. Office 365를 선택합니다.
  4. 로그인을 선택합니다.
  5. 등록을 선택한 다음 새 어셈블리 등록을 선택합니다. 등록을 선택한 다음 새 어셈블리 등록을 선택합니다.
  6. 1단계에서 (...) 버튼을 선택하고 이전 단계에서 빌드한 dll을 선택합니다.
  7. 선택한 플러그 인 등록을 선택합니다.

단계 등록

  1. 등록된 어셈블리 목록에서 CustomValidationPlugin을 선택합니다.
  2. 새 단계 등록을 선택합니다.
  3. 메시지 텍스트 필드에 msdynmkt_validateformsubmission을 입력합니다.
  4. 실행 모드동기로 설정되어 있는지 확인합니다. 실행 모드가 동기로 설정되어 있는지 확인합니다.
  5. 실행 순서10으로 설정되어 있는지 확인하세요.
  6. 이벤트 파이프라인 실행 단계연산 후로 설정되어 있는지 확인합니다.
  7. 새 단계 등록을 선택합니다.

결론

data-validate-submission 특성이 있는 양식이 제출되면 사용자 지정 플러그 인이 Google 서비스로 reCAPTCHA 응답을 실행하고 유효성을 검사합니다. 사용자 지정 플러그 인은 기본 Microsoft 유효성 검사 플러그 인 이후에 실행됩니다. 양식에 Microsoft 캡차 필드가 없는 경우 Microsoft 플러그 인은 IsValid:false를 설정하고 IsValid:true로 덮어쓰지 않는 한 제출이 실패합니다.

유효성 검사 흐름.