Delen via


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

  1. Open Visual Studio en maak een nieuw klassebibliotheekproject met .NET Framework 4.6.2.
  2. Selecteer in Solution ExplorerNuGet-pakketten beheren en installeer Microsoft.CrmSdk.CoreAssemblies.

De klasse voor de invoegtoepassing maken

  1. Wijzig de naam van Class1.cs in CustomValidationPlugin.cs.

  2. Laat de klasse CustomValidationPlugin overnemen van de IPlugin-interface en voeg de uitvoeringsmethode toe.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. 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));
    }
    
  4. 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;
    }
    
  5. 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;
    }
    
  6. 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. Een FormUrlEncodedContent-object wordt gemaakt met daarin de recaptchaToken die in eerdere stappen is opgehaald en de geheime sleutel die door Google wordt verstrekt. Vervolgens wordt er een POST-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 en GRecaptchaResponse, die later wordt gedefinieerd. Vervolgens maakt dit een nieuw ValidateFormSubmissionResponse -object aan, serialiseert dit en stelt het in als de waarde van de uitvoerparameter msdynmkt_validationresponse, de enige Microsoft-service die wordt gebruikt om de inzending te accepteren of af te wijzen. Als u de tekenreeks g-recaptcha-response aan de lijst ValidationOnlyFields toevoegt, wordt dit veld verborgen bij het indienen van het formulier in de gebruikersinterface.

  7. 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;
    }
    
  8. 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

  1. Klik met de rechtermuisknop op het project en selecteer Eigenschappen in de Solution Explorer.
  2. Selecteer het tabblad Ondertekenen en vink het selectievakje voor De assembly ondertekenen aan.
  3. Selecteer <New...>.
  4. Voer een sleutelbestandsnaam in en deselecteer Mijn sleutelbestand met een wachtwoord beschermen.
  5. Bouw het project.
  6. U kunt de invoegtoepassingsassembly CustomValidationPlugin.dll vinden in \bin\Debug.

De invoegtoepassing registreren

  1. PluginRegistration.exe openen.
  2. Selecteer Nieuwe verbinding maken.
  3. Kies Office 365.
  4. Selecteer Aanmelden.
  5. Selecteer Registreren en vervolgens Nieuwe assembly registreren. Selecteer Registreren en vervolgens Nieuwe assembly registreren.
  6. Selecteer de knop (...) in stap 1 en selecteer de dll die in de vorige stappen is gebouwd.
  7. Selecteer Geselecteerde invoegtoepassing registreren.

Stap registreren

  1. Selecteer CustomValidationPlugin in de lijst met de geregistreerde assembly′s.
  2. Selecteer Nieuwe stap registreren.
  3. Voer msdynmkt_validateformsubmission in het veld berichttekst in.
  4. Zorg ervoor dat Uitvoermodus is ingesteld op Synchroon. Zorg ervoor dat Uitvoermodus is ingesteld op Synchroon.
  5. Zorg dat Uitvoeringsvolgorde is ingesteld op 10.
  6. Zorg ervoor dat Fase van uitvoering gebeurtenis-pipeline is ingesteld op Nabewerking.
  7. 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.

Validatiestroom.