Προσαρμογή επικύρωσης υποβολής φόρμας
Η επικύρωση από την πλευρά του πελάτη στις φόρμες μάρκετινγκ και εγγραφής σε εκδηλώσεις βοηθά στη διασφάλιση της εγκυρότητας των δεδομένων που υποβάλλονται από τον πελάτη. Ωστόσο, σε ορισμένες περιπτώσεις μπορεί να χρειαστείτε μια πιο περίπλοκη επικύρωση. Για παράδειγμα, ίσως χρειαστεί να συγκρίνετε τα υποβληθέντα δεδομένα με τα δεδομένα που υπάρχουν ήδη στο σύστημά σας. Για να διευκολυνθεί η πολύπλοκη επικύρωση, αυτό το άρθρο περιγράφει λεπτομερώς πώς μπορείτε να δημιουργήσετε μια προσαρμοσμένη προσθήκη για να επικυρώσετε τα υποβληθέντα δεδομένα στο back-end και να ενεργοποιήσετε επιπλέον λογική επεξεργασίας δεδομένων.
Δημιουργήστε μια προσθήκη
Σημείωμα
Αυτό το παράδειγμα προσαρμοσμένης προσθήκης δείχνει πώς να δημιουργήσετε επικύρωση back-end για το κλειδί reCAPTCHA. Μπορεί να λειτουργήσει ως έμπνευση για τη ροή επικύρωσης. Εάν θέλετε να ενσωματώσετε το reCAPTCHA στη φόρμα σας, μπορείτε να χρησιμοποιήσετε την προκατασκευασμένη προσθήκη και να ακολουθήσετε αυτόν τον οδηγό.
Δημιουργήσετε ένα έργο Visual Studio για την προσθήκη
- Ανοίξτε το Visual Studio και δημιουργήστε ένα νέο έργο βιβλιοθήκης κλάσης χρησιμοποιώντας το .NET Framework 4.6.2.
- Στην Εξερεύνηση λύσεων, επιλέξτε Διαχείριση πακέτων NuGet και εγκαταστήστε το
Microsoft.CrmSdk.CoreAssemblies
.
Δημιουργήστε την κλάση προσθήκης
Μετονομάστε το
Class1.cs
σεCustomValidationPlugin.cs
.Κάντε την κλάση CustomValidationPlugin να μεταβιβάζεται από το περιβάλλον εργασίας IPlugin και προσθέστε τη μέθοδο execute.
public class CustomValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { } }
Για να ανακτήσετε το περιβάλλον και την υπηρεσία εντοπισμού, προσθέστε τον ακόλουθο κώδικα στη μέθοδο εκτέλεσης.
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)); }
Προσθέστε αυτόν τον κωδικό για την ανάκτηση της συμβολοσειράς παραμέτρου υποβολής φόρμας. Είναι μια κωδικοποιημένη συμβολοσειρά JSON που αντιπροσωπεύει τα πεδία που υπέβαλε ο χρήστης στη φόρμα. Αυτή η διαδικασία ανακτά τη συμβολοσειρά και την αποσειριοποιεί χρησιμοποιώντας μια βοηθητική μέθοδο αποσειριοποίησης και μια κλάση FormSubmissionRequest που ορίζεται αργότερα. Αυτός ο κώδικας ελέγχει ότι ο πίνακας πεδίων περιέχει ένα κλειδί για το g-recaptcha-response. Εάν το κλειδί reCAPTCHA δεν βρεθεί, επιστρέφει την παράλειψη επικύρωσης, καθώς η φόρμα που επεξεργάζεται δεν περιείχε στοιχείο 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; }
Προσθέστε τον ακόλουθο κώδικα για να επιστρέψετε εάν η τιμή
g-recaptcha-token
είναι null ή κενή.if (String.IsNullOrEmpty(recaptchaToken)) { tracingService.Trace($"g-recaptcha-response value not found"); return; }
Προσθέστε τον παρακάτω κώδικα για να επικυρώσετε το διακριτικό captcha της Google έναντι των API της 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}"); } }
Αρχικά, ορίζεται η διεύθυνση URL και έπειτα δημιουργείται μια παρουσία
HttpClient
. Δημιουργείται ένα αντικείμενοFormUrlEncodedContent
που περιέχει τοrecaptchaToken
που ανακτήθηκε σε προηγούμενα βήματα και το μυστικό κλειδί που παρέχεται από την Google. Στη συνέχεια, ένα αίτημαPOST
αποστέλλεται και ο κωδικός κατάστασης ελέγχεται, εάν δεν είναι επιτυχής. Εάν είναι επιτυχής, αποσειριοποιεί την απόκριση χρησιμοποιώντας τη μέθοδο βοήθειας αποσειριοποίηση και τοGRecaptchaResponse
που ορίζεται αργότερα. Στη συνέχεια, ένα νέο αντικείμενοValidateFormSubmissionResponse
το σειριοποιεί και το ορίζει ως τιμή της παραμέτρου εξόδουmsdynmkt_validationresponse
, η οποία είναι η υπηρεσία της Microsoft που χρησιμοποιεί για να αποδεχτεί ή να απορρίψει την υποβολή. Η προσθήκη της συμβολοσειράςg-recaptcha-response
στη λίσταValidationOnlyFields
αποκρύπτει αυτό το πεδίο από την υποβολή της φόρμας στο περιβάλλον εργασίας χρήστη.Προσθέστε τον παρακάτω κώδικα για να καθορίσετε μεθόδους βοήθειας για τη σειριοποίηση και την αποσειριοποίηση.
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; }
Προσθέστε τον ακόλουθο κώδικα για να ορίσετε τις κλάσεις που απαιτούνται για τη σειριοποίηση και την αποσειριοποίηση αντικειμένων συμβολοσειρών 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; } }
Υπογράψτε και δημιουργήστε την προσθήκη
- Κάντε δεξιό κλικ στο έργο και επιλέξτε Ιδιότητες στην Εξερεύνηση λύσεων.
- Επιλέξτε την καρτέλα Υπογραφή και επιλέξτε το πλαίσιο ελέγχου Υπογραφή της συγκρότησης.
- Επιλέξτε το στοιχείο
<New...>
. - Εισαγάγετε ένα όνομα αρχείου κλειδιού και καταργήστε την επιλογή Προστασία του αρχείου κλειδιού μου με έναν κωδικό πρόσβασης.
- Δημιουργία του έργου.
- Μπορείτε να βρείτε τη συγκρότηση της προσθήκης
CustomValidationPlugin.dll
στο\bin\Debug
.
Καταχωρήστε προσθήκη
- Άνοιγμα
PluginRegistration.exe
. - Επιλέξτε Δημιουργία νέας σύνδεσης.
- Επιλέξτε Office 365.
- Επιλέξτε Σύνδεση.
- Επιλέξτε Καταχώρηση και έπειτα Καταχώριση νέας συγκρότησης.
- Επιλέξτε το κουμπί (...) στο βήμα 1 και επιλέξτε το dll που είναι ενσωματωμένο στα προηγούμενα βήματα.
- Επιλέξτε Καταχώριση επιλεγμένης προσθήκης.
Καταχωρήστε βήμα
- Επιλέξτε CustomValidationPlugin από τη λίστα των καταχωρημένων συγκροτήσεων.
- Επιλέξτε Καταχώριση επόμενου βήματος.
- Εισαγάγετε το
msdynmkt_validateformsubmission
στο πεδίο κειμένου μηνύματος. - Βεβαιωθείτε ότι η λειτουργία εκτέλεσης έχει οριστεί ως συγχρονισμένη.
- Βεβαιωθείτε ότι η Εντολή εκτέλεσης έχει οριστεί σε
10
. - Βεβαιωθείτε ότι το Στάδιο εκτέλεσης διοχέτευσης συμβάντος έχει οριστεί ως Δημοσίευση λειτουργίας.
- Επιλέξτε Καταχώριση επόμενου βήματος.
Συμπέρασμα
Όταν υποβάλλεται μια φόρμα με το χαρακτηριστικό data-validate-submission
, η προσαρμοσμένη προσθήκη εκτελείται και επικυρώνει την απόκριση reCAPTCHA με τις υπηρεσίες Google. Η προσαρμοσμένη προσθήκη εκτελείται μετά την προεπιλεγμένη προσθήκη επικύρωσης Microsoft. Εάν δεν υπάρχουν πεδία captcha της Microsoft στη φόρμα, η προσθήκη της Microsoft ορίζει το IsValid:false
και η υποβολή αποτυγχάνει, εκτός εάν την αντικαταστήσετε με IsValid:true
.