Anpassa validering av formuläröverföring
Valideringen på klientsidan i marknadsförings- och evenemangsregistreringsformulär hjälper till att säkerställa att de uppgifter som kunden skickar in är giltiga. I vissa fall kan du dock behöva en mer komplex validering. Du kan till exempel behöva jämföra inlämnade data med de data som redan finns i ditt system. För att underlätta komplex validering beskriver den här artikeln hur du kan skapa ett anpassat plugin-program för att validera skickade data på serverdelen och utlösa extra databearbetningslogik.
Skapa plugin-program
Obs
Det här exemplet på anpassat plugin-program visar hur du bygger backend-validering för reCAPTCHA-nyckeln. Det kan fungera som inspiration för ditt valideringsflöde. Om du vill integrera reCAPTCHA i ditt formulär kan du använda det fördefinierade plugin-programmet och följa den här guiden.
Skapa ett Visual Studio-projekt för plugin-programmet
- Öppna Visual Studio och skapa ett nytt projekt för klassbibliotek med hjälp av .NET Framework 4.6.2.
- I lösningsutforskaren väljer du Hantera NuGet-paket och installera
Microsoft.CrmSdk.CoreAssemblies
.
Skapa plugin-klassen
Byt namn på
Class1.cs
tillCustomValidationPlugin.cs
.Gör klassen CustomValidationPlugin ärva från IPlugin-gränssnittet och lägg till körningsmetoden.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
Om du vill hämta kontext- och spårningstjänsten lägger du till följande kod i körningsmetoden.
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)); }
Lägg till den här koden för att hämta parametersträngen för formuläröverföring. Det är en JSON-kodad sträng som representerar fälten som användaren skickade i formuläret. Den här processen hämtar strängen och deserialiserar den med hjälp av en deserialiseringshjälpmetod och FormSubmissionRequest-klass som definieras senare. Den här koden kontrollerar att fältmatrisen innehåller en nyckel för g-recaptcha-response. Om reCAPTCHA-nyckeln inte hittas returnerar den att valideringen hoppas över eftersom formuläret som bearbetas inte innehöll något 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; }
Lägg till följande kod för att returnera om
g-recaptcha-token
värdet är null eller tomt.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
Lägg till följande kod för att verifiera Google captcha-token mot 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 definieras URL:en och sedan skapas en instans av
HttpClient
. EttFormUrlEncodedContent
objekt skapas med det somrecaptchaToken
har hämtats i föregående steg och nyckeln som tillhandahålls av Google. Sedan skickas en förfråganPOST
och statuskoden kontrolleras om den inte lyckas. Om det lyckas deserialiserar det svaret med hjälp av metoden hjälpmetoden för deserialisera ochGRecaptchaResponse
som definieras senare. Sedan skapas ett nyttValidateFormSubmissionResponse
objekt, serialiserar det och ställer in det som värdet på utdataparameternmsdynmkt_validationresponse
, vilket är den Microsoft-tjänst den använder för att acceptera eller avvisa inlämningen. Om du lägger till strängeng-recaptcha-response
i listanValidationOnlyFields
döljs det här fältet från formuläröverföringen i användargränssnittet.Lägg till följande kod för att definiera hjälpmetoder för serialisering och 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; }
Lägg till följande kod för att definiera de klasser som behövs för att serialisera och deserialisera JSON-strängobjekt.
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; } }
Logga in och skapa plugin-programmet
- Högerklicka på projektet och välj Egenskaper i Lösningsutforskaren.
- Markera fliken Signering och markera kryssrutan Skriv under sammansättning .
- Markera
<New...>
. - Ange ett filnamn för nyckeln och avmarkera Skydda nyckelfilen med ett lösenord.
- Skapa projektet.
- Plugin-programmet finns i sammansättningen
CustomValidationPlugin.dll
i\bin\Debug
.
Registrera plugin-program
- Öppna
PluginRegistration.exe
. - Välj Skapa ny anslutning.
- Välj Office 365.
- Välj Logga in.
- Välj Registrera och sedan Registrera ny sammansättning.
- Välj knappen (...) i steg 1 och välj dll-filen som du skapat i föregående steg.
- Välj Registrera valt plugin-program.
Registrera steg
- Välj CustomValidationPlugin i listan med registrerade sammansättningar.
- Välj Registrera nytt steg.
- Ange
msdynmkt_validateformsubmission
i meddelandetextfältet. - Kontrollera att körningsläget är synkront.
- Se till att Utförandeorder är inställd på
10
. - Se till att Pipelinestadium för händelse för körning anges som Post-åtgärd.
- Välj Registrera nytt steg.
Slutsats
När ett formulär med attributet data-validate-submission
skickas in körs och verifieras ditt anpassade plugin-program reCAPTCHA-svaret med Google-tjänster. Det anpassade plugin-programmet körs efter standardplugin-programmet för Microsoft-validering. Om det inte finns några Microsoft captcha-fält i formuläret anger Microsoft-plugin-programmet IsValid:false
och överföringen misslyckas om du inte skriver över det med IsValid:true
.