Web API 2中的Google reCaptcha c#

Sam*_*our 2 c# recaptcha asp.net-web-api asp.net-web-api2

我有一个ASP.NET Web API 2项目.我试图从表单中读取Google Captcha.我试过这个代码:

    public string Post(FoundingRequest model)
    {
        var response = Request["g-recaptcha-response"];
        string secretKey = "my key";
        var client = new WebClient();
        var result = client.DownloadString(
        $"https://www.google.com/recaptcha/api/siteverify?secret={secretKey}&response={response}");
        var obj = JObject.Parse(result);
        model.Captcha = (bool)obj.SelectToken("success");
        ....
    }
Run Code Online (Sandbox Code Playgroud)

但我在第一行收到错误:

无法将带有[]的索引应用于类型为"HttpRequestMessage"的表达式

为什么?以及如何解决?谢谢

Sou*_*Xin 5

这个方法对我的身体很好:

 const string secretKey = "YOUR KEY";
            string responseFromServer = "";

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://www.google.com/recaptcha/api/siteverify?secret=" + secretKey + "&response=" + response);

            using (WebResponse resp = req.GetResponse())
            using (Stream dataStream = resp.GetResponseStream())
            {
                if (dataStream != null)
                {
                    using (StreamReader reader = new StreamReader(dataStream))
                    {
                        // Read the content.
                        responseFromServer = reader.ReadToEnd();
                    }
                }
            }

            dynamic jsonResponse = new JavaScriptSerializer().DeserializeObject(responseFromServer);

            return jsonResponse == null || bool.Parse(jsonResponse["success"].ToString());
Run Code Online (Sandbox Code Playgroud)

更新

关于评论,可以在客户端进行检查

var response = window.grecaptcha.getResponse()

然后将此变量传递给Web API

这是我的客户端脚本的一部分:

      if (typeof window.grecaptcha != 'undefined') {
        var capResponse = window.grecaptcha.getResponse();

        if (!capResponse || capResponse.length === 0) {
            user.isCaptchaPassed = false;
            //alert("Captcha not Passed");
            return false;
        }

        user.gReCaptcha = capResponse;
    }
Run Code Online (Sandbox Code Playgroud)

"user"是之前创建的JS对象,它通过JS传递给服务器.(AJAX电话)


Sam*_*our 2

我找到了答案,我创建了一个具有特定名称的隐藏输入,并在验证码回调上更新了其值。代码:

   <input type="hidden" value="" id="recaptcha" name="recaptcha" />
   <div class="g-recaptcha" data-callback="imNotARobot" data-sitekey="key"></div>
Run Code Online (Sandbox Code Playgroud)

JavaScript 是:

<script type="text/javascript">
    var imNotARobot = function () {
       $("#recaptcha").val(grecaptcha.getResponse());
    };
</script>
Run Code Online (Sandbox Code Playgroud)

服务器端:

public string Recaptcha { get; set; }
Run Code Online (Sandbox Code Playgroud)

模型绑定器完成所有工作。