Pas de validatie van formulierinzendingen aan
De validatie aan client-zijde in marketing- en gebeurtenisregistratieformulieren helpt de geldigheid van de door de klant verstrekte gegevens te garanderen. In sommige gevallen is echter een complexere validatie nodig. Het kan bijvoorbeeld nodig zijn dat u de ingediende gegevens vergelijkt met de gegevens die al in uw systeem aanwezig zijn. Om complexe validatie te vergemakkelijken, wordt in dit artikel beschreven hoe u een aangepaste invoegtoepassing kunt bouwen om de verzonden gegevens in de back-end te valideren en extra logica voor gegevensverwerking te activeren.
Een invoegtoepassing maken
Notitie
Dit voorbeeld van een aangepaste invoegtoepassing laat zien hoe u back-end-validatie voor de reCAPTCHA-sleutel bouwt. Het kan dienen als inspiratie voor uw validatiestroom. Als u reCAPTCHA in uw formulier wilt integreren, kunt u de vooraf gebouwde invoegtoepassing gebruiken en deze guide volgen.
Een Visual Studio-project maken voor de invoegtoepassing
- Open Visual Studio en maak een nieuw klassebibliotheekproject met .NET Framework 4.6.2.
- Selecteer in Solution ExplorerNuGet-pakketten beheren en installeer
Microsoft.CrmSdk.CoreAssemblies
.
De klasse voor de invoegtoepassing maken
Wijzig de naam van
Class1.cs
inCustomValidationPlugin.cs
.Laat de klasse CustomValidationPlugin overnemen van de IPlugin-interface en voeg de uitvoeringsmethode toe.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
Om de context en de traceringsservice op te halen, voegt u de volgende code toe aan de execute-methode.
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)); }
Voeg deze code toe om de parametertekenreeks voor inzending van formulieren op te halen. Het is een JSON-gecodeerde tekenreeks die de velden vertegenwoordigt die de gebruiker in het formulier heeft ingediend. Dit proces haalt de tekenreeks op en deserialiseert deze met behulp van een helpmethode voor deserialisatie en de FormSubmissionRequest-klasse die later wordt gedefinieerd. Deze code controleert of de veldenmatrix een sleutel voor g-recaptcha-response bevat. Als de reCAPTCHA-sleutel niet wordt gevonden, wordt de validatie overgeslagen omdat het formulier dat wordt verwerkt geen recaptcha-element bevat.
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; }
Voeg de volgende code die moet worden geretourneerd als de waarde voor
g-recaptcha-token
null of leeg is.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
Voeg de volgende code toe om het Google captcha-token te valideren met de Google API's.
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}"); } }
Eerst wordt de URL gedefinieerd, vervolgens wordt een exemplaar van
HttpClient
gemaakt. EenFormUrlEncodedContent
-object wordt gemaakt met daarin derecaptchaToken
die in eerdere stappen is opgehaald en de geheime sleutel die door Google wordt verstrekt. Vervolgens wordt er eenPOST
-aanvraag verzonden en wordt de statuscode gecontroleerd. Als deze niet succesvol is, wordt deze geretourneerd. Als dit is gelukt, deserialiseert dit de respons met behulp van de hulpmethode Deserialiseren enGRecaptchaResponse
, die later wordt gedefinieerd. Vervolgens maakt dit een nieuwValidateFormSubmissionResponse
-object aan, serialiseert dit en stelt het in als de waarde van de uitvoerparametermsdynmkt_validationresponse
, de enige Microsoft-service die wordt gebruikt om de inzending te accepteren of af te wijzen. Als u de tekenreeksg-recaptcha-response
aan de lijstValidationOnlyFields
toevoegt, wordt dit veld verborgen bij het indienen van het formulier in de gebruikersinterface.Voeg de volgende code toe om de hulpmethoden Serialiseren en Deserialiseren te definiëren.
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; }
Voeg de volgende code toe om de klassen te definiëren die nodig zijn om JSON-tekenreeksobjecten te serialiseren en deserialiseren.
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; } }
De invoegtoepassing ondertekenen en bouwen
- Klik met de rechtermuisknop op het project en selecteer Eigenschappen in de Solution Explorer.
- Selecteer het tabblad Ondertekenen en vink het selectievakje voor De assembly ondertekenen aan.
- Selecteer
<New...>
. - Voer een sleutelbestandsnaam in en deselecteer Mijn sleutelbestand met een wachtwoord beschermen.
- Bouw het project.
- U kunt de invoegtoepassingsassembly
CustomValidationPlugin.dll
vinden in\bin\Debug
.
De invoegtoepassing registreren
-
PluginRegistration.exe
openen. - Selecteer Nieuwe verbinding maken.
- Kies Office 365.
- Selecteer Aanmelden.
- Selecteer Registreren en vervolgens Nieuwe assembly registreren.
- Selecteer de knop (...) in stap 1 en selecteer de dll die in de vorige stappen is gebouwd.
- Selecteer Geselecteerde invoegtoepassing registreren.
Stap registreren
- Selecteer CustomValidationPlugin in de lijst met de geregistreerde assembly′s.
- Selecteer Nieuwe stap registreren.
- Voer
msdynmkt_validateformsubmission
in het veld berichttekst in. - Zorg ervoor dat Uitvoermodus is ingesteld op Synchroon.
- Zorg dat Uitvoeringsvolgorde is ingesteld op
10
. - Zorg ervoor dat Fase van uitvoering gebeurtenis-pipeline is ingesteld op Nabewerking.
- Selecteer Nieuwe stap registreren.
Conclusie
Wanneer een formulier met het kenmerk data-validate-submission
wordt ingezonden, wordt uw aangepaste invoegtoepassing uitgevoerd en wordt de reCAPTCHA-respons met Google-services gevalideerd. De aangepaste invoegtoepassing wordt uitgevoerd na de standaard Microsoft-validatie-invoegtoepassing. Als er geen Microsoft captcha-velden in het formulier zijn, wordt de Microsoft-invoegtoepassing IsValid:false
ingesteld en mislukt de indiening tenzij u deze overschrijft met IsValid:true
.