フォーム送信の検証をカスタマイズする
マーケティングおよびイベント登録フォームでのクライアント側の検証は、顧客から送信されたデータの有効性を確認するのに役立ちます。 ただし、場合によっては、より複雑な検証が必要になることがあります。 たとえば、送信されたデータと、システムに既に存在するデータを比較する必要がある場合があります。 この記事では、複雑な検証を容易にするために、バックエンドで送信されたデータを検証し、追加のデータ処理ロジックをトリガーするカスタム プラグインを構築する方法について詳しく説明します。
プラグインの作成
ヒント
このカスタムプラグインの例は、reCAPTCHAキーのバックエンド検証を構築する方法を示しています。 これは、検証フローのヒントとして役立ちます。 reCAPTCHAをフォームに統合する場合は、事前構築済みのプラグインを使用し、 このガイドに従ってください。
プラグイン用の Visual Studio プロジェクトを作成する
- Visual Studio を開き、.NET Framework 4.6.2 を使用した新しいクラス ライブラリ プロジェクトを作成します。
- ソリューション エクスプローラー で、管理 NuGet パッケージ を選択して
Microsoft.CrmSdk.CoreAssemblies
をインストールします。
プラグイン クラスを作成する
Class1.cs
をCustomValidationPlugin.cs
に名称変更します。CustomValidationPlugin クラスを IPlugin インターフェイスを継承させ、Execute メソッドを追加します。
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
のインスタンスが作成されます。 前の手順で取得したFormUrlEncodedContent
と、Google から提供された秘密鍵を含むrecaptchaToken
オブジェクトが作成されます。 次にPOST
リクエストが送信され、ステータス コードがチェックされ、成功しなかった場合は返されます。 成功した場合は、後で定義される逆シリアル化 ヘルパー メソッドとGRecaptchaResponse
を使用して、応答を逆シリアル化します。 次に、新しいValidateFormSubmissionResponse
オブジェクトを作成し、それをシリアル化して、出力パラメータmsdynmkt_validationresponse
の値として設定します。これは、投稿を受け入れるか拒否するかを決定するために使用する Microsoft サービスの 1 つです。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
で上書きしない限り、送信は失敗します。