Jaa


Mukautetun captcha-palvelun integroiminen Customer Insights - Journeysin lomakkeisiin

Customer Insights - Journeysin lomakkeista on mahdollista tarkistaa lomakelähetykset käyttämällä mukautettua Captcha-toimintoa boteilta suojautumiseen. Tässä esimerkissä on esimerkki Google reCAPTCHA -toiminnon integroinnista. Työnkulku on samankaltainen muiden Captcha-palveluiden osalta.

Muistiinpano

Sovelluksen nykyisessä versiossa vain yksi captcha-toteutus voi olla aktiivinen. Jos käytät oman captcha-palveluntarjoajan (kuten alla on kuvattu), valmista captchaa käyttävät lomakkeet lakkaavat toimimasta. Mukautettu captcha-toteutus vaatii vähintään perustiedot Dataverse-laajennusten kirjoittamisesta ja virheenkorjauksesta.

Prosessin vaiheet:

  1. reCAPTCHA-toiminnon lisääminen lomakkeeseen.
  2. Captcha-tekstiarvon lisääminen lomakelähetykseen, kun lomake lähetetään.
  3. Laajennuksen luominen CRM:ssä tarkistamaan Captcha-toiminto.

Vaiheittainen esimerkki: Google reCAPTCHA -integrointi

1. reCAPTCHA-toiminnon lisääminen lomakkeeseen

  1. Luo lomake Customer Insights - Journeysin lomake-editorissa.

  2. Lisää data-validate-submission="true"-määrite <form>-elementtiin mahdollistamaan mukautettu tarkistus lomakkeen lähetyksessä:

    Määritteen lisääminen lomake-elementtiin

  3. Lisää <div id="g-recaptcha"> lomakkeeseen reCAPTCHA-toiminnon paikkamerkiksi. Tätä div ID -tunnusta käytetään myöhemmin viitteenä. Paikkamerkin suositeltu sijainti on viimeisen kentän ja lähetyspainikkeen välillä.

    reCAPTCHA-toiminnon paikkamerkin lisääminen

  4. Julkaise lomake ja upota se sivustoon.

  5. Muokkaa sivua, johon lomake upotettiin. Lisää Googlen toimittama komentosarja sivun otsikkoon. Komentosarja lataa reCAPTCHA-toiminnon ja onLoad-vastakutsuparametrin. Tämä vastakutsu tehdään heti, kun Captcha-toiminto ladataan.

    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback" async defer></script>
    
  6. Lisää onLoadCallback-vastakutsu:

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

    Vaihda {sitekey}-paikkamerkin tilalle Google toimittama paikkamerkki. Tämä vastakutsu hahmontaa reCAPTCHA-toiminnon aiemmin luodussa paikkamerkissä <div id="g-recaptcha">.

  7. Rekisteröi onloadCallback-funktio, jota lomakelataaja kutsuu:

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

2. Captcha-tekstiarvon lisääminen lomakkeen lähetykseen

Kun lomake lähetetään, g-recaptcha-response-parametri lisätään automaattisesti lomakkeen lähetykseen. Seuraavissa vaiheissa muodostetaan tämän arvon piilottava laajennus, sillä se lisätään laajennuskoodin palauttaman vastausobjektin ValidationOnlyFields-luetteloon.

G-recaptcha-response-parametri lisätään

3. Laajennuksen luominen

3.1 Visual Studio -projektin luominen laajennukseen

  1. Avaa Visual Studio ja luo uusi luokkakirjastoprojekti käyttämällä versiota .NET Framework 4.6.2.
  2. Valitse ratkaisunhallinnassa NuGet-pakettien hallinta ja asenna Microsoft.CrmSdk.CoreAssemblies.

3.2 Laajennusluokan luominen

  1. Muuta Class1.cs muotoon CustomValidationPlugin.cs.

  2. Määritä CustomValidationPlugin-luokka perimään IPlugin-liittymästä ja lisää suoritusmenetelmä.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. Lisää seuraava koodi suoritusmenetelmään noutamaan konteksti ja jäljityspalvelu.

    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. Lisää tämä koodi noutamaan lomakkeen lähetyksen parametrimerkkijono. Se on JSON-koodattu merkkijono, joka ilmaisee käyttäjän lomakkeessa lähettämät kentät. Tämä prosessi noutaa kyseisen merkkijonon ja poistaa sen sarjoituksen käyttämällä sarjoituksen poiston apusovellusta ja myöhemmin määritettävää FormSubmissionRequest-luokkaa. Tämä tarkistaa, että kenttämatriisi sisältää g-recaptcha-response-avaimen. Jos reCAPTCHA-avainta ei löydy, se palauttaa tarkistuksen ohituksen käsiteltävänä lomakkeena, joka ei sisältänyt Google Recaptcha -elementtiä.

    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. Lisää seuraava koodi, joka palautetaan, jos g-recaptcha-token-arvo on tyhjäarvo tai tyhjä.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. Lisää seuraava koodi tarkistamaan Google Captcha -tunnus Google-ohjelmointirajapintojen perusteella.

    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}");
        }
    }
    

    Ensimmäiseksi määritetään URL-osoite ja sen jälkeen luodaan HttpClient-esiintymä. Edellisissä vaiheissa noudetun recaptchaToken-tunnuksen ja Googlen toimittaman salaisen avaimen sisältävä FormUrlEncodedContent-objekti luodaan. Sen jälkeen lähetetään POST-pyyntö ja tilakoodi tarkistetaan; epäonnistuessa se palautetaan. Onnistuessa se poistaa vastauksen sarjoituksen käyttämällä sarjoituksen poiston apusovellusta ja myöhemmin määritettävää GRecaptchaResponse-objektia. Se luo sitten uuden ValidateFormSubmissionResponse-objektin, sarjoittaa sen ja määrittää sen msdynmkt_validationresponse-tulosparametrin arvoksi. Microsoft-palvelu käyttää tätä parametria lähetyksen hyväksymiseen tai hylkäämiseen. g-recaptcha-response-merkkijonon lisääminen ValidationOnlyFields-luetteloon piilottaa tämän kentän lomakkeen lähetyksestä käyttöliittymässä.

  7. Lisää seuraava koodi määrittää sarjoitusmenetelmä ja sarjoituksen poiston apusovellus.

    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. Lisää seuraava koodi määrittämään luokat, jotka tarvitaan JSON-merkkijono-objektien sarjoittamiseen ja sarjoittamisen purkamiseen.

    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 Laajennuksen allekirjoittaminen ja muodostaminen

  1. Napsauta projektia hiiren kakkospainikkeella ja valitse ratkaisunhallinnassa Ominaisuudet.
  2. Valitse Allekirjoitus-välilehti ja valitse Sitten Allekirjoita kokoonpano -valintaruutu.
  3. Valitse <New...>.
  4. Kirjoita avaintiedoston nimi ja poista Suojaa avaintiedosto salasanalla.
  5. Muodosta projekti.
  6. Laajennuskokoonpano CustomValidationPlugin.dll sijaitsee kohdassa \bin\Debug.

3.4 Laajennuksen rekisteröiminen

  1. Avaa PluginRegistration.exe.
  2. Valitse Luo uusi yhteys.
  3. Valitse Office 365.
  4. Valitse Sisäänkirjaus.
  5. Valitse ensin Rekisteröi ja sitten Rekisteröi uusi kokoonpano.

    Valitse ensin Rekisteröi ja sitten Rekisteröi uusi kokoonpano

  6. Valitse (...)-painike vaiheessa 1 ja valitse edellisissä vaiheissa muodostettu dll.
  7. Valitse Rekisteröi valittu laajennus.

3.4 Vaiheen rekisteröinti

  1. Valitse rekisteröityjen kokoonpanojen luettelossa CustomValidationPlugin.
  2. Valitse Rekisteröi uusi vaihe.
  3. Syötä msdynmkt_validateformsubmission Viesti-tekstikenttään.
  4. Varmista, että Suoritusmenetelmä-määrityksenä on Synkroninen.

    Varmista, että Suoritusmenetelmä-määrityksenä on Synkroninen

  5. Varmista, että toteutusjärjestykseksi on asetettu 10.
  6. Varmista, että Tapahtumaputken suoritusvaihe -määrityksenä on Jälkitoiminto.
  7. Valitse Rekisteröi uusi vaihe.

Yhteenveto

Kun data-validate-submission-määritteen sisältävä lomake lähetetään, mukautettu laajennus suoritetaan ja se tarkistaa reCAPTCHA-vastauksen Google-palveluissa. Mukautettu laajennus suoritetaan Microsoftin oletustarkistuslaajennuksen jälkeen. Jos lomakkeessa ei ole Microsoftin Captcha-kenttiä, Microsoft-laajennus tekee määrityksen IsValid:false ja lähetys epäonnistuu, ellei sitä korvata IsValid:true-määrityksellä.

Tarkistustyönkulku