Tilpass validering av skjemainnsending
Valideringen på klientsiden i markedsførings- og hendelsesregistreringsskjemaer bidrar til å sikre gyldigheten av dataene som er sendt inn av kunden. I noen tilfeller kan det imidlertid hende du trenger en mer kompleks validering. Det kan for eksempel hende at du må sammenligne innsendte data med dataene som allerede finnes i systemet. For å legge til rette for kompleks validering beskriver denne artikkelen hvordan du kan bygge et egendefinert programtillegg for å validere de innsendte dataene på serverdelen og utløse ekstra databehandlingslogikk.
Opprett et programtillegg
Notat
Dette eksemplet på egendefinert programtillegg viser hvordan du bygger serverdelvalidering for reCAPTCHA-nøkkelen. Det kan fungere som inspirasjon for valideringsflyten. Hvis du vil integrere reCAPTCHA i skjemaet ditt, kan du bruke det forhåndsbygde programtillegget og følge denne veiledningen.
Opprett et Visual Studio-prosjekt for programtillegget
- Åpne Visual Studio og opprett et nytt klassebibliotekprosjekt ved hjelp av .NET Framework 4.6.2.
- I løsningsutforskeren velger du Administrer NuGet-pakker og installerer
Microsoft.CrmSdk.CoreAssemblies
.
Opprett klassen for programtillegget
Endre navnet på
Class1.cs
tilCustomValidationPlugin.cs
.Sørg for at CustomValidationPlugin-klassen arver fra IPlugin-grensesnittet, og legg til kjøringsmetoden.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
Hvis du vil hente kontekst og sporingstjeneste, legger du til følgende kode i kjøringsmetoden.
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)); }
Legg til denne koden for å hente parameterstrengen for skjemainnsending. Det er en JSON-kodet streng som representerer feltene som brukeren sendte inn i skjemaet. Denne prosessen henter strengen og deserialiserer den ved hjelp av en metode for deserialiseringshjelp og FormSubmissionRequest-klassen som defineres senere. Denne koden kontrollerer at feltmatrisen inneholder en nøkkel for g-recaptcha-svar. Hvis reCAPTCHA-nøkkelen ikke blir funnet, returnerer den hopp over validering siden skjemaet som behandles, ikke inneholdt 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; }
Legg til følgende kode som skal returneres hvis
g-recaptcha-token
-verdien er null eller tom.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
Legg til følgende kode for å validere Google captcha-tokenet mot API-er fra 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}"); } }
Først defineres URL-adressen, og deretter opprettes det en forekomst av
HttpClient
. EtFormUrlEncodedContent
-objekt opprettes medrecaptchaToken
som ble hentet i de tidligere trinnene, og den hemmelige nøkkelen fra Google. Deretter sendes enPOST
-forespørsel, og statuskoden kontrolleres, og returneres hvis den ikke lykkes. Hvis den er vellykket, deserialiseres svaret ved hjelp av hjelpermetoden ogGRecaptchaResponse
som defineres senere. Deretter opprettes et nyttValidateFormSubmissionResponse
-objekt. Det serialiseres og blir angitt som verdien til utdataparameterenmsdynmkt_validationresponse
, som er den ene Microsoft-tjenesten den bruker til å godta eller avvise innsendingen. Hvis du legger til strengeng-recaptcha-response
i listenValidationOnlyFields
, skjules dette feltet fra skjemainnsendingen i brukergrensesnittet.Legg til følgende kode for å definere hjelpemetoder for 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; }
Legg til følgende kode for å definere klassene som trengs for å 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; } }
Logg på og bygg programtillegget
- Høyreklikk på prosjektet, og velg Egenskaper i løsningsutforskeren.
- Velg kategorien Signering, og merk av for Signer samlingen.
- Velg
<New...>
. - Skriv inn et navn på nøkkelfilen, og fjern valget for Beskytt nøkkelfilen min med et passord.
- Bygg prosjektet.
- Du finner plugin-modulsamlingen
CustomValidationPlugin.dll
i\bin\Debug
.
Registrer programtillegget
- Åpne
PluginRegistration.exe
. - Velg Opprett ny tilkobling.
- Velg Office 365.
- Velg Logg på.
- Velg Registrer og deretter Registrer ny samling.
- Velg knappen (...) i trinn 1, og velg dll-filen som ble innebygd i de forrige trinnene.
- Velg Registrer valgt plugin-modul.
Registrer trinn
- Velg CustomValidationPlugin fra listen over de registrerte samlingene.
- Velg Registrer nytt trinn.
- Skriv inn
msdynmkt_validateformsubmission
i meldingstekstfeltet. - Kontroller at kjøringsmodusen er angitt som Synkron.
- Kontroller at Utførelsesordre er satt til
10
. - Kontroller at Pipelinetrinn for utførelse for hendelse er angitt som Etter operasjon.
- Velg Registrer nytt trinn.
Konklusjon
Når et skjema med attributtet data-validate-submission
er sendt inn, kjører den egendefinerte plugin-modulen og validerer reCAPTCHA-svaret med Google-tjenester. Det egendefinerte programtillegget kjører etter standard Microsoft-valideringprogramtillegget. Hvis det ikke finnes Microsoft captcha-felter i skjemaet, vil plugin-modulen fra Microsoft angi IsValid:false
, og innsendingen vil mislykkes med mindre du skriver over den med IsValid:true
.