Tilpasse validering af formularafsendelse
Valideringen på klientsiden i marketing- og arrangementstilmeldingsformularer er med til at sikre gyldigheden af de data, som kunden har sendt. I nogle tilfælde kan det dog være nødvendigt med en mere kompleks validering. Det kan f.eks. være nødvendigt at sammenligne indsendte data med de data, der allerede findes i dit system. For at lette kompleks validering beskriver denne artikel, hvordan du kan opbygge et brugerdefineret plugin for at validere de indsendte data på back-end og udløse ekstra databehandlingslogik.
Opret en plug-in
Bemærk
Dette eksempel på brugerdefineret plugin viser, hvordan du bygger back-end-validering for reCAPTCHA-nøglen. Den kan bruges som inspiration for dit valideringsflow. Hvis du vil integrere reCAPTCHA i din formular, kan du bruge det forudbyggede plugin og følge denne vejledning.
Opret et Visual Studio-projekt til plug-in'en
- Åbn Visual Studio, og opret et nyt klassebiblioteksprojekt ved hjælp af .NET Framework 4.6.2.
- I Løsningsoversigt skal du vælge Administrer NuGet-pakker og installere
Microsoft.CrmSdk.CoreAssemblies
.
Opret plug-in-klassen
Omdøb
Class1.cs
tilCustomValidationPlugin.cs
.Få CustomValidationPlugin-klassen til at arve fra brugergrænsefladen i IPlugin, og tilføj metoden Execute.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
Hvis du vil hente kontekst- og sporingstjenesten, skal du tilføje følgende kode i udførelsesmetoden.
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)); }
Tilføj denne kode for at hente parameterstrengen til formularindsendelse. Det er en JSON-kodet streng, der repræsenterer de felter, som brugeren har sendt i formularen. I denne proces hentes strengen og deserialiseres ved hjælp af en deserialiseringshjælpemetode og en FormSubmissionRequest-klasse, der defineres senere. Denne kode kontrollerer, at feltmatrixen indeholder en nøgle til g-recaptcha-response. Hvis reCAPTCHA-nøglen ikke bliver fundet, springes validering over, da den formular, der behandles, ikke indeholder et recaptcha-element.
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; }
Tilføj følgende kode, der skal returneres, hvis
g-recaptcha-token
-værdien er null eller tom.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
Tilføj følgende kode for at validere Google-captcha-tokenet i forhold til Google API'er.
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}"); } }
Først defineres URL-adressen, og derefter oprettes der en forekomst af
HttpClient
. Der oprettes etFormUrlEncodedContent
-objekt, som indeholder detrecaptchaToken
, der er hentet i tidligere trin, og den hemmelige nøgle, der leveres af Google. Derefter sendes enPOST
-anmodning, og statuskoden kontrolleres og returneres, hvis den ikke lykkes. Hvis den lykkes, deserialiseres svaret ved hjælp af hjælpemetoden til deserialisering ogGRecaptchaResponse
, der defineres senere. Derefter oprettes der et nytValidateFormSubmissionResponse
-objekt, det serialiseres, og det angives som værdien for outputparameterenmsdynmkt_validationresponse
, som er den tjeneste i Microsoft, som bruges til at acceptere eller afvise afsendelsen. Hvis du føjerg-recaptcha-response
-strengen tilValidationOnlyFields
-listen, skjules dette felt fra formularafsendelsen i brugergrænsefladen.Tilføj følgende kode for at definere hjælpemetoderne til serialisering og deserialisering.
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; }
Tilføj følgende kode for at definere de klasser, der skal bruges til at serialisere og deserialisere JSON-strengobjekter.
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; } }
Signer og opbyg plug-in'en
- Højreklik på projektet, og vælg Egenskaber i Løsningsoversigt.
- Vælg fanen Signering , og markér afkrydsningsfeltet Signer assembly.
- Vælg
<New...>
. - Angiv navnet på en nøglefil, og fravælg Beskyt min nøglefil med en adgangskode.
- Opbyg projektet.
- Du kan finde plug-in-assemblyen
CustomValidationPlugin.dll
i\bin\Debug
.
Registrer plug-in
- Åbn
PluginRegistration.exe
. - Vælg Opret ny forbindelse.
- Vælg Office 365.
- Vælg Logon.
- Vælg Registrer og derefter Registrer ny assembly.
- Vælg knappen (...) i trin 1, og vælg den dll, der blev oprettet i forrige trin.
- Vælg Register valgte plug-in.
Registrer trin
- Vælg CustomValidationPlugin på listen over registrerede assemblies.
- Vælg Registrer nyt trin.
- Indtast
msdynmkt_validateformsubmission
i meddelelsestekstfeltet. - Kontrollér, at Udførelsestilstand er angivet som Synkron.
- Sørg for, at Udførelsesrækkefølge er indstillet til
10
. - Sørg for, at Hændelsespipelinefasen af udførelsen er angivet til Efterfølgende handling.
- Vælg Registrer nyt trin.
Konklusion
Når en formular med attributten data-validate-submission
sendes, kører og validerer din brugerdefinerede plug-in reCAPTCHA-svaret med Google-tjenester. Det brugerdefinerede plugin kører efter standard Microsoft valideringsplugin. Hvis der ikke er nogen Microsoft captcha-felter i formularen, indstilles Microsoft-plug-in IsValid:false
, og afsendelsen mislykkes, medmindre du overskriver den med IsValid:true
.