Sdílet prostřednictvím


Přizpůsobení ověření odeslání formuláře

Validace na straně klienta v marketingových formulářích a registracích akcí pomáhá zajistit platnost údajů předložených zákazníkem. V některých případech ale možná budete potřebovat složitější ověření. Může být například nutné porovnat odeslaná data s daty, která již ve vašem systému existují. Pro usnadnění komplexního ověřování tento článek podrobně popisuje, jak můžete vytvořit vlastní modul plug-in pro ověření odeslaných dat na back-endu a aktivaci další logiky zpracování dat.

Vytvoření modulu plug-in

Poznámka:

Tento příklad vlastního modulu plug-in ukazuje, jak vytvořit back-endové ověření pro klíč reCAPTCHA. Může sloužit jako inspirace pro váš tok ověřování. Pokud chcete integrovat reCAPTCHA do svého formuláře, můžete použít předem připravený plugin a postupovat podle tohoto průvodce.

Vytvoření projektu Visual Studio pro modul plug-in

  1. Otevřete Visual Studio a vytvořte nový projekt knihovny třídy pomocí .NET framework 4.6.2.
  2. V Průzkumníku řešení vyberte Správa balíčků NuGet a nainstalujte Microsoft.CrmSdk.CoreAssemblies.

Vytvoření třídy modulů plug-in

  1. Přejmenujte Class1.cs na CustomValidationPlugin.cs.

  2. Zajistěte, aby třída CustomValidationPlugin dědila z rozhraní IPlugin a přidejte metodu Execute.

    public class CustomValidationPlugin : IPlugin
    {
       public void Execute(IServiceProvider serviceProvider)
       {
    
       }
    }
    
  3. Chcete-li načíst kontextovou a trasovací službu, přidejte do metody execute následující kód.

    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. Přidejte tento kód, abyste načetli řetězec parametru odeslání formuláře. Je to řetězec kódovaný JSON představující pole, která uživatel odeslal ve formuláři. Tento proces načte řetězec a deserializuje ho pomocí pomocné metody deserializace a třídy FormSubmissionRequest, která je definována později. Tento kód kontroluje, zda pole fields obsahuje klíč pro g-recaptcha-response. Pokud se klíč reCAPTCHA nenajde, vrátí přeskočení ověření, protože formulář, který se zpracovává, neobsahoval prvek recaptcha.

    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. Přidejte následující kód, který se vrátí, pokud g-recaptcha-token je null nebo prázdná.

    if (String.IsNullOrEmpty(recaptchaToken))
    {
       tracingService.Trace($"g-recaptcha-response value not found");
       return;
    }
    
  6. Přidejte následující kód, abyste ověřili token Google captcha prostřednictvím rozhraní Google API.

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

    Nejprve je definována adresa URL a poté je vytvořena instance HttpClient. Vytvoří se objekt FormUrlEncodedContent obsahující recaptchaToken získaný v předchozích krocích a tajný kód poskytnutý společností Google. Poté se odešle požadavek POST a zkontroluje se stavový kód, pokud není úspěšný, vrátí se. Pokud je úspěšný, deserializuje odpověď s použitím pomocné metody Deserializovat a paramteru GRecaptchaResponse, který je definován později. Poté vytvoří nový objekt ValidateFormSubmissionResponse, serializuje jej a nastaví jako hodnotu výstupního parametru msdynmkt_validationresponse, což je jedna služba společnosti Microsoft, kterou používá k přijetí nebo odmítnutí odeslání. Přidáním řetězce g-recaptcha-response do seznamu ValidationOnlyFields skryjete toto pole před odesláním formuláře v uživatelském rozhraní.

  7. Přidejte následující kód k definování pomocných metod Serializace a Deserializace.

    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. Přidejte následující kód pro definování tříd potřebných k serializaci a deserializaci objektů řetězců JSON.

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

Podepsání a vytvoření modulu plug-in

  1. Klikněte pravým tlačítkem na projekt a vyberte Vlastnosti v Průzkumníku řešení.
  2. Vyberte kartu Podpis a zaškrtněte políčko Podepsat sestavení.
  3. Vyberte možnost <New...>.
  4. Zadejte název souboru klíče a zrušte výběr Chránit heslem můj soubor klíče.
  5. Sestavte projekt.
  6. Sestavení modulu plug-in CustomValidationPlugin.dll najdete v umístění \bin\Debug.

Registrace modulu plug-in

  1. Otevře záznam typu PluginRegistration.exe.
  2. Vyberte Vytvořit nové připojení.
  3. Zvolte Office 365.
  4. Vyberte volbu Přihlásit se.
  5. Vyberte Registrovat a poté Registrovat nové sestavení. Vyberte Registrovat a poté Registrovat nové sestavení.
  6. V kroku 1 vyberte tlačítko (...) a vyberte knihovnu dll vytvořenou v předchozích krocích.
  7. Vyberte Registrovat vybrané moduly plug-in.

Krok registrace

  1. Ze seznamu registrovaných sestavení vyberte CustomValidationPlugin.
  2. Vyberte Registrovat nový krok.
  3. Do textového pole zprávy zadejte msdynmkt_validateformsubmission.
  4. Ujistěte se, že Režim provádění je nastaven jako Synchronní. Ujistěte se, že Režim provádění je nastaven jako Synchronní.
  5. Ujistěte se, že je Prováděcí příkaz nastaven na 10.
  6. Ujistěte se, že Fáze profilace události provádění je nastavena jako Po operaci.
  7. Vyberte Registrovat nový krok.

Závěr

Po odeslání formuláře s atributem data-validate-submission se spustí váš vlastní modul plug-in a ověří odpověď reCAPTCHA pomocí služeb Google. Vlastní modul plug-in se spustí po výchozím ověřovacím modulu plug-in Microsoft. Pokud ve formuláři nejsou žádná pole captcha společnosti Microsoft, modul plug-in společnosti Microsoft nastaví IsValid:false a odeslání se nezdaří, pokud jej nepřepíšete pomocí IsValid:true.

Tok ověření.