양식 제출 유효성 검사 사용자 지정
마케팅 및 이벤트 등록 양식의 클라이언트 측 유효성 검사는 고객이 제출한 데이터의 유효성을 보장하는 데 도움이 됩니다. 그러나 경우에 따라 더 복잡한 유효성 검사가 필요할 수 있습니다. 예를 들어, 제출된 데이터를 시스템에 이미 존재하는 데이터와 비교해야 할 수 있습니다. 복잡한 유효성 검사를 용이하게 하기 위해 이 문서에서는 백엔드에서 제출된 데이터의 유효성을 검사하고 추가 데이터 처리 논리를 트리거하는 사용자 지정 플러그인을 빌드하는 방법을 자세히 설명합니다.
플러그 인 만들기
참고
이 사용자 지정 플러그 인의 예는 reCAPTCHA 키에 대한 백엔드 유효성 검사를 빌드하는 방법을 보여줍니다. 유효성 검사 흐름에 대한 영감으로 사용할 수 있습니다. 양식에 reCAPTCHA를 통합하려면 사전 빌드된 플러그 인을 사용하고 이 가이드를 따르세요.
플러그 인용 Visual Studio 프로젝트 만들기
- Visual Studio를 열고 .NET Framework 4.6.2를 사용하여 새 클래스 라이브러리 프로젝트를 만듭니다.
-
솔루션 탐색기에서 NuGet 패키지 관리를 선택하고
Microsoft.CrmSdk.CoreAssemblies
를 설치합니다.
플러그 인 클래스 만들기
Class1.cs
의 이름을CustomValidationPlugin.cs
로 바꿉니다.CustomValidationPlugin 클래스가 IPlugin 인터페이스에서 상속되도록 만들고 실행 메서드를 추가합니다.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
컨텍스트 및 추적 서비스를 검색하려면 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)); }
이 코드를 추가하여 양식 제출 매개 변수 문자열을 검색하십시오. 사용자가 양식에서 제출한 필드를 나타내는 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; }
g-recaptcha-token
값이 null이거나 비어 있는 경우 반환하려면 다음 코드를 추가합니다.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
다음 코드를 추가하여 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
목록에 추가하면 사용자 인터페이스의 양식 제출에서 해당 필드가 숨겨집니다.다음 코드를 추가하여 직렬화 및 역직렬화 도우미 메서드를 정의합니다.
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; }
다음 코드를 추가하여 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; } }
플러그 인 서명 및 빌드
- 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 솔루션 탐색기에서 속성을 선택합니다.
- 서명 탭을 선택하고 어셈블리 서명 확인란을 선택합니다.
-
<New...>
를 선택합니다. - 키 파일 이름을 입력하고 암호로 내 키 파일 보호를 선택 취소합니다.
- 프로젝트를 빌드합니다.
- 플러그 인 어셈블리
CustomValidationPlugin.dll
은\bin\Debug
에서 확인할 수 있습니다.
플러그 인 등록
-
PluginRegistration.exe
을(를) 여십시오. - 새 연결 만들기를 선택합니다.
- Office 365를 선택합니다.
- 로그인을 선택합니다.
-
등록을 선택한 다음 새 어셈블리 등록을 선택합니다.
- 1단계에서 (...) 버튼을 선택하고 이전 단계에서 빌드한 dll을 선택합니다.
- 선택한 플러그 인 등록을 선택합니다.
단계 등록
- 등록된 어셈블리 목록에서 CustomValidationPlugin을 선택합니다.
- 새 단계 등록을 선택합니다.
- 메시지 텍스트 필드에
msdynmkt_validateformsubmission
을 입력합니다. -
실행 모드가 동기로 설정되어 있는지 확인합니다.
-
실행 순서가
10
으로 설정되어 있는지 확인하세요. - 이벤트 파이프라인 실행 단계가 연산 후로 설정되어 있는지 확인합니다.
- 새 단계 등록을 선택합니다.
결론
data-validate-submission
특성이 있는 양식이 제출되면 사용자 지정 플러그 인이 Google 서비스로 reCAPTCHA 응답을 실행하고 유효성을 검사합니다. 사용자 지정 플러그 인은 기본 Microsoft 유효성 검사 플러그 인 이후에 실행됩니다. 양식에 Microsoft 캡차 필드가 없는 경우 Microsoft 플러그 인은 IsValid:false
를 설정하고 IsValid:true
로 덮어쓰지 않는 한 제출이 실패합니다.