Dela via


Integrera en anpassad captcha-tjänst med Customer Insights - Journeys-formulär

Customer Insights - Journeys-formulär i realtid kan du använda ditt anpassade robotskydd mot captcha för att verifiera formulärinskick. Den här artikeln innehåller ett exempel på hur du integrerar Google reCAPTCHA. Flödet är liknande för andra captcha-tjänster.

Kommentar

I den nuvarande versionen av appen kan endast en captcha-implementering vara aktiv. Om du använder din egen captcha-leverantör (som beskrivs nedan), kommer befintliga formulär som använder den färdiga captcha att sluta fungera. En anpassad captcha-implementering kräver åtminstone grundläggande kunskaper om att skriva och felsöka Dataverse plugin-program.

Processen består av följande steg:

  1. Lägg till reCAPTCHA i formuläret.
  2. Lägg till captcha-textvärdet i formulärinskick när formuläret har skickats.
  3. Skapa ett plugin-program i CRM för validering av captcha.

Steg-för-steg-exempel: Integrera Google reCAPTCHA

1. Lägg till reCAPTCHA i formuläret

  1. Skapa ett formulär i formulärredigeraren för Customer Insights - Journeys.

  2. Lägg till ett data-validate-submission="true" attribut i <form> elementet, vilket gör det möjligt att anpassa valideringen när formuläret skickas:

    Lägg till attribut till formulärelement.

  3. Lägg till en <div id="g-recaptcha"> i formuläret som platshållare för reCAPTCHA. Detta div-ID används som referens senare. Det rekommenderas att placera platshållaren mellan det sista fältet och knappen Skicka.

    Lägg till platshållare för reCAPTCHA.

  4. Publicera formuläret och infoga det på webbplatsen.

  5. Redigera sidan där formuläret var inbäddat. Lägg till skriptet från Google i sidhuvudet. Det här skriptet läser in reCAPTCHA med motringningsparametern onLoad. Motringning anropas så fort captcha har lästs in.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Lägg till funktionen onLoadCallback:

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

    Ersätt platshållaren {sitekey} med den som tillhandahålls av Google. Den här motringningsfunktionen återger reCAPTCHA i platshållare <div id="g-recaptcha"> som du skapade tidigare.

  7. Registrera onloadCallback-funktionen som ska anropas av formulärladdaren:

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

2. Lägg till textvärdet för captcha i formulärets underkastelse

När formuläret har skickats läggs g-recaptcha-response parametern till automatiskt i formulärets underkastelse. I nästa steg kommer du att skapa ett plugin-program som döljer detta värde, eftersom det kommer att läggas till i ValidationOnlyFields lista i svarsobjektet som returneras av pluginkoden.

G-recaptcha-svarsparameter läggs till.

3. Skapa plugin-program

3.1 Skapa ett Visual Studio projekt för plugin-programmet

  1. Öppna Visual Studio och skapa ett nytt projekt för klassbibliotek med hjälp av .NET Framework 4.6.2.
  2. I lösningsutforskaren, välj Hantera NuGet-paket och installera Microsoft.CrmSdk.CoreAssemblies.

3.2 Skapa plugin-klassen

  1. Byt namn på Class1.cs till CustomValidationPlugin.cs.

  2. 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)
       {
    
       }
    }
    
  3. Lägg till följande kod i körningsmetoden för hämtning av sammanhangs- och spårningstjänst.

    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. 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 den här strängen och deserialiserar den med hjälp av hjälpmetoden för deserialisera och klassen FormSubmissionRequest som definieras senare. Detta kontrollerar att fältmatrisen innehåller en nyckel för g-recaptcha svar. Om du inte hittar reCAPTCHA-nyckeln returnerar den hoppa över valideringen eftersom formuläret som bearbetar inte innehåller något 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. Lägg till följande kod 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;
    }
    
  6. 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. Ett FormUrlEncodedContent objekt skapas med det som recaptchaToken har hämtats i föregående steg och nyckeln som tillhandahålls av Google. Sedan skickas en förfrågan POST och statuskoden kontrolleras om den inte lyckas. Om det lyckas deserialiserar det svaret med hjälp av metoden hjälpmetoden för deserialisera och GRecaptchaResponse som definieras senare. Sedan skapas ett nytt ValidateFormSubmissionResponse objekt, serialiserar det och ställer in det som värdet på utdataparametern msdynmkt_validationresponse, vilket är den Microsoft-tjänst den använder för att acceptera eller avvisa inlämningen. Lägga till g-recaptcha-response sträng till listan ValidationOnlyFields döljer detta fält från formuläröverföringen i användargränssnittet.

  7. 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;
    }
    
  8. Lägg till följande kod för att definiera de klasser som behövs för att serialisera/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; }
     }
    

3.3 Logga in och skapa plugin-programmet

  1. Högerklicka på projektet och välj Egenskaper i Lösningsutforskaren.
  2. Markera fliken Signering och markera kryssrutan Skriv under sammansättning .
  3. Markera <New...>.
  4. Ange ett filnamn för nyckeln och avmarkera Skydda nyckelfilen med ett lösenord.
  5. Skapa projektet.
  6. Plugin-programmet finns i sammansättningen CustomValidationPlugin.dll i \bin\Debug.

3.4 Registrera plugin-program

  1. Öppna PluginRegistration.exe.
  2. Välj Skapa ny anslutning.
  3. Välj Office 365.
  4. Välj Logga in.
  5. Välj Registrera och sedan Registrera ny sammansättning.

    Välj Registrera och sedan Registrera ny sammansättning.

  6. Välj knappen (...) i steg 1 och välj dll-filen som du skapat i föregående steg.
  7. Välj Registrera valt plugin-program.

3.4: Registrera steg

  1. Välj CustomValidationPlugin i listan med registrerade sammansättningar.
  2. Välj Registrera nytt steg.
  3. Ange msdynmkt_validateformsubmission i textfältet Meddelande.
  4. Kontrollera att körningsläget är synkront.

    Kontrollera att körningsläget är synkront.

  5. Se till att Utförandeorder är inställd på 10.
  6. Se till att Pipelinestadium för händelse för körning anges som Post-åtgärd.
  7. 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 det standardinställda plugin-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.

Valideringsflöde.