Del via


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

  1. Åpne Visual Studio og opprett et nytt klassebibliotekprosjekt ved hjelp av .NET Framework 4.6.2.
  2. I løsningsutforskeren velger du Administrer NuGet-pakker og installerer Microsoft.CrmSdk.CoreAssemblies.

Opprett klassen for programtillegget

  1. Endre navnet på Class1.cs til CustomValidationPlugin.cs.

  2. Sørg for at CustomValidationPlugin-klassen arver fra IPlugin-grensesnittet, og legg til kjøringsmetoden.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. 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));
    }
    
  4. 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;
    }
    
  5. 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;
    }
    
  6. 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. Et FormUrlEncodedContent-objekt opprettes med recaptchaToken som ble hentet i de tidligere trinnene, og den hemmelige nøkkelen fra Google. Deretter sendes en POST-forespørsel, og statuskoden kontrolleres, og returneres hvis den ikke lykkes. Hvis den er vellykket, deserialiseres svaret ved hjelp av hjelpermetoden og GRecaptchaResponse som defineres senere. Deretter opprettes et nytt ValidateFormSubmissionResponse-objekt. Det serialiseres og blir angitt som verdien til utdataparameteren msdynmkt_validationresponse, som er den ene Microsoft-tjenesten den bruker til å godta eller avvise innsendingen. Hvis du legger til strengen g-recaptcha-response i listen ValidationOnlyFields, skjules dette feltet fra skjemainnsendingen i brukergrensesnittet.

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

  1. Høyreklikk på prosjektet, og velg Egenskaper i løsningsutforskeren.
  2. Velg kategorien Signering, og merk av for Signer samlingen.
  3. Velg <New...>.
  4. Skriv inn et navn på nøkkelfilen, og fjern valget for Beskytt nøkkelfilen min med et passord.
  5. Bygg prosjektet.
  6. Du finner plugin-modulsamlingen CustomValidationPlugin.dll i \bin\Debug.

Registrer programtillegget

  1. Åpne PluginRegistration.exe.
  2. Velg Opprett ny tilkobling.
  3. Velg Office 365.
  4. Velg Logg på.
  5. Velg Registrer og deretter Registrer ny samling. Velg Registrer og deretter Registrer ny samling.
  6. Velg knappen (...) i trinn 1, og velg dll-filen som ble innebygd i de forrige trinnene.
  7. Velg Registrer valgt plugin-modul.

Registrer trinn

  1. Velg CustomValidationPlugin fra listen over de registrerte samlingene.
  2. Velg Registrer nytt trinn.
  3. Skriv inn msdynmkt_validateformsubmission i meldingstekstfeltet.
  4. Kontroller at kjøringsmodusen er angitt som Synkron. Kontroller at kjøringsmodusen er angitt som Synkron.
  5. Kontroller at Utførelsesordre er satt til 10.
  6. Kontroller at Pipelinetrinn for utførelse for hendelse er angitt som Etter operasjon.
  7. 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.

Valideringsflyt.