0

我正在开发一个 Kentico 应用程序 V12(在相同的代码将部署到 12 到 7 的其他安装之后),我添加了一个新的表单控件。在我的情况下,控件用于 Google Recaptcha V3 令牌(所以我不需要保存值),所以这些是我的步骤:

  • 我通过 Kentico 界面添加了新的表单控件
  • 我在一个表单中添加了一个新字段来测试功能
  • 我添加了 Javascript 部分来管理 recaptcha 验证

实际上我能够管理客户端的所有流程,我现在的目标是在保存数据之前验证令牌,所以我在我的 ascx 文件中添加了这段代码

public partial class CMSModules_ReCAPTCHA : FormEngineUserControl
{

    private static string GOOGLE_RECAPTCHA_LIBRARY_URL = "https://www.google.com/recaptcha/api.js";

    public override bool IsValid()
    {
        return this.Validate();
    }

    public override object Value
    {
        get
        {
            // How can I get the value?
        }
        set { }
    }

    private bool Validate()
    {
        // Here's the code to validate the token
    }
}

如果我发送表单,我可以在检查器上看到令牌已发送,但是如何在我的 ascx 文件中获取该值并在验证不成功时收到错误消息?我试过了,CMS.Helpers.ValidationHelper.GetString(Form.GetFieldValue("reCAPTCHA"))但它不起作用。reCAPTCHA 它是字段的名称,该值作为 g-recaptcha-response 发送。

4

1 回答 1

1

因此,我们处理此问题的方法是在前端文件 (.ascx) 上添加一个 HiddenField 控件,该 HiddenField 由您运行的 javascript 填充以使用标准的 recaptcha 内容(正如您提到的那样)。然后在回发表单时,该 HiddenField 具有您的 Value 属性可以使用的令牌值。

在表单控件的 .ascx 上

<asp:HiddenField runat="server" ID="recaptchaToken" ClientIDMode="Static" />

然后在 formcontrol 的 .ascx.cs 文件上

public override object Value
{
    get
    {
        return recaptchaToken.Value;
    }
    set
    {
        recaptchaToken.Value = (string)value;
    }
}

这样,它应该在您拥有表单控件的表单的回发中。

请记住,您的 JavaScript 也需要填充该值。喜欢:

document.getElementById('recaptchaToken').value = token; //the one from Google

您可能还必须处理验证。为此,我们覆盖 IsValid 成员并使用令牌调用 Google 进行验证。向下和肮脏的版本看起来像:

public override bool IsValid()
{
    if (Value == null || String.IsNullOrEmpty(Value.ToString()))
        return false;

    var tokenResponse = Value.ToString();

    // Clear for next time around
    Value = "";

    return ReCaptchaCheckPassed(GoogleSecretKey, tokenResponse);
}

public static bool ReCaptchaCheckPassed(string GoogleSecretKey, string RecaptchaResponse)
{
    HttpClient httpClient = new HttpClient();

    var res = httpClient.GetAsync($"https://www.google.com/recaptcha/api/siteverify?secret={googleSecretKey}&response={RecaptchaResponse}").Result;

    if (res.StatusCode != HttpStatusCode.OK)
        return false;

    string JSONres = res.Content.ReadAsStringAsync().Result;

    dynamic JSONdata = JObject.Parse(JSONres);

    if (JSONdata.success != "true")
        return false;

    return true;
}
于 2021-03-02T01:16:27.317 回答