Del via


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

  1. Åbn Visual Studio, og opret et nyt klassebiblioteksprojekt ved hjælp af .NET Framework 4.6.2.
  2. I Løsningsoversigt skal du vælge Administrer NuGet-pakker og installere Microsoft.CrmSdk.CoreAssemblies.

Opret plug-in-klassen

  1. Omdøb Class1.cs til CustomValidationPlugin.cs.

  2. 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)
       {
    
       }
    }
    
  3. 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));
    }
    
  4. 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;
    }
    
  5. 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;
    }
    
  6. 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 et FormUrlEncodedContent-objekt, som indeholder det recaptchaToken, der er hentet i tidligere trin, og den hemmelige nøgle, der leveres af Google. Derefter sendes en POST-anmodning, og statuskoden kontrolleres og returneres, hvis den ikke lykkes. Hvis den lykkes, deserialiseres svaret ved hjælp af hjælpemetoden til deserialisering og GRecaptchaResponse, der defineres senere. Derefter oprettes der et nyt ValidateFormSubmissionResponse-objekt, det serialiseres, og det angives som værdien for outputparameteren msdynmkt_validationresponse, som er den tjeneste i Microsoft, som bruges til at acceptere eller afvise afsendelsen. Hvis du føjer g-recaptcha-response-strengen til ValidationOnlyFields-listen, skjules dette felt fra formularafsendelsen i brugergrænsefladen.

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

  1. Højreklik på projektet, og vælg Egenskaber i Løsningsoversigt.
  2. Vælg fanen Signering , og markér afkrydsningsfeltet Signer assembly.
  3. Vælg <New...>.
  4. Angiv navnet på en nøglefil, og fravælg Beskyt min nøglefil med en adgangskode.
  5. Opbyg projektet.
  6. Du kan finde plug-in-assemblyen CustomValidationPlugin.dll i \bin\Debug.

Registrer plug-in

  1. Åbn PluginRegistration.exe.
  2. Vælg Opret ny forbindelse.
  3. Vælg Office 365.
  4. Vælg Logon.
  5. Vælg Registrer og derefter Registrer ny assembly. Vælg Registrer og derefter Registrer ny assembly.
  6. Vælg knappen (...) i trin 1, og vælg den dll, der blev oprettet i forrige trin.
  7. Vælg Register valgte plug-in.

Registrer trin

  1. Vælg CustomValidationPlugin på listen over registrerede assemblies.
  2. Vælg Registrer nyt trin.
  3. Indtast msdynmkt_validateformsubmission i meddelelsestekstfeltet.
  4. Kontrollér, at Udførelsestilstand er angivet som Synkron. Kontrollér, at Udførelsestilstand er angivet som Synkron.
  5. Sørg for, at Udførelsesrækkefølge er indstillet til 10.
  6. Sørg for, at Hændelsespipelinefasen af udførelsen er angivet til Efterfølgende handling.
  7. 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.

Valideringsflow.