Del via


Integrere en brugerdefineret captcha-service med Customer Insights - Journeys-formularer

Customer Insights - Journeys-formularer giver dig mulighed for at bruge egen captcha-beskyttelse mod robotter til at validere formularafsendelser. Denne artikel indeholder et eksempel på, hvordan du integrerer Google reCAPTCHA. Flowet er lignende for andre captcha-tjenester.

Bemærk

I den aktuelle version af appen kan kun én captcha-implementering være aktiv. Hvis du bruger din egen captcha-udbyder (som beskrevet nedenfor), vil eksisterende formularer, der bruger den indbyggede captcha, holde op med at fungere. En brugerdefineret captcha-implementering kræver mindst grundlæggende viden om at skrive og fejlfinde Dataverse-plugins.

Processen består af disse trin:

  1. Føj reCAPTCHA til formularen.
  2. Føj captcha-tekstværdien til formularens afsendelse, når formularen er afsendt.
  3. Opret en plug-in i CRM, der validerer captcha.

Eksempel trin for trin: Integrer Google reCAPTCHA

1. Føj reCAPTCHA til formularen

  1. Opret en formular i Customer Insights - Journeys-formulareditoren.

  2. Føj en data-validate-submission="true" attribut til elementet <form>, hvilket muliggør brugerdefineret validering af formularafsendelsen:

    Føj attribut til formularsegmentet.

  3. Tilføj en <div id="g-recaptcha"> i formularen som pladsholder for reCAPTCHA. Dette div-id bruges som reference senere. Det anbefales, at du placerer pladsholderen mellem det sidste felt og knappen Send.

    Tilføj pladsholder for reCAPTCHA.

  4. Publicer formularen, og integrer formularen på dit websted.

  5. Rediger den side, hvor formularen blev integreret. Tilføj scriptet fra Google i sidehovedet. Dette script indlæser reCAPTCHA med tilbagekaldsparameteren onLoad. Dette tilbagekald kaldes, så snart captcha er indlæst.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Tilføj funktionen onLoadCallback:

    function onloadCallback() {
        grecaptcha.render('g-recaptcha',
        { 
          sitekey: '{sitekey}',
        });
    }
    

    Udskift {sitekey} pladsholderen med den, der leveres af Google. Denne tilbagekaldsfunktion gengiver reCAPTCHA i pladsholderen <div id="g-recaptcha">, du har oprettet tidligere.

  7. Registrer onloadCallback-funktionen, der skal kaldes af formularindlæseren:

document.addEventListener("d365mkt-afterformload", onloadCallback);

2. Føj captcha-tekstværdien til formularens afsendelse

Når formularen er afsendt, føjes g-recaptcha-response parameteren automatisk til formularens afsendelse. I de næste trin skal du oprette en plug-in, der skjuler denne værdi, da den vil blive føjet til listen ValidationOnlyFields i det svarobjekt, der returneres af plug-in-koden.

Parameteren G-recaptcha-response tilføjes.

3. Opret en plug-in

3.1 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.

3.2 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. Tilføj følgende kode i kørselsmetoden for at hente kontekst- og sporingstjenesten.

    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. Denne proces henter denne streng og deserialiserer den ved hjælp af hjælpemetoden Deserialize og klassen FormSubmissionRequest, der defineres senere. Dette kontrollerer, at feltmatrixen indeholder en nøgle til g-recaptcha-response. Hvis reCAPTCHA-nøglen ikke blev fundet, returnerer den overspringning af validering, da den formular, der er behandlet, ikke indeholder et Google 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 til returnering, 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 Deserialize-hjælpemetoden 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 strengen g-recaptcha-response til listen ValidationOnlyFields, skjules dette felt fra formularens afsendelse i brugergrænsefladen.

  7. Tilføj følgende kode for at definere Serialize- og Deserialize-hjælpemetoder.

    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/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; }
     }
    

3.3 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.

3.4 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.

3.4 Registrer trin

  1. Vælg CustomValidationPlugin på listen over registrerede assemblies.
  2. Vælg Registrer nyt trin.
  3. Angiv msdynmkt_validateformsubmission i tekstfeltet Meddelelse.
  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. Den brugerdefinerede plug-in kører efter Microsoft-standardvaliderings-plugin. 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.