18

有没有人在 ASP.NET 中有完整的 reCaptcha V3 实现演示?

我找到了这篇文章:Google Recaptcha v3 示例演示

目前我正在使用带有以下代码的 reCaptcha V2:

public bool RecaptchaValidate()
    {
        string Response = Request.Form["g-recaptcha-response"];//Getting Response String Append to Post Method
        bool Valid = false;
        //Request to Google Server
        var CaptchaSiteKey = Settings["NewUserRegCaptchaSecretSiteKey"].ToString();
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create
        (" https://www.google.com/recaptcha/api/siteverify?secret=" + CaptchaSiteKey + "&response=" + Response);
        try
        {
            //Google recaptcha Response
            using (WebResponse wResponse = req.GetResponse())
            {

                using (StreamReader readStream = new StreamReader(wResponse.GetResponseStream()))
                {
                    string jsonResponse = readStream.ReadToEnd();

                    JavaScriptSerializer js = new JavaScriptSerializer();
                    ReCaptchaObject data = js.Deserialize<ReCaptchaObject>(jsonResponse);// Deserialize Json

                    Valid = Convert.ToBoolean(data.success);
                }
            }

            return Valid;
        }
        catch (WebException ex)
        {
            throw ex;
        }
    }

在 view.ascx 页面上,我有:

<%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>

<script src='https://www.google.com/recaptcha/api.js'></script>

<scrip>
var recap = grecaptcha.getResponse();
if (recap.length == 0) {
                $("#verifyhuman").css("display", "block");
            }
</script>

 <div class="g-recaptcha" data-sitekey="<%=ReCaptchaPublicKey%>" id="recaptcha" data-callback="recaptchaCallback"></div>
4

4 回答 4

43

最简单的实现:

  1. 在您的cshtml文件中(在顶部)

    @section Scripts
    {
        <script src="https://www.google.com/recaptcha/api.js?render=your site key"></script>
        <script>
            grecaptcha.ready(function () {
                grecaptcha.execute('your site key', { action: 'homepage' }).then(function (token) {
                    document.getElementById("foo").value = token;
                });
            });
        </script>
    }
    
  2. 在您的cshtml, 表格内(就在 之前</form>):

    <input type="hidden" id="foo" name="foo" />
    
  3. 类中的一个函数Pagemodel。请参阅响应对象的文档:

    public static bool ReCaptchaPassed(string gRecaptchaResponse)
    {
        HttpClient httpClient = new HttpClient();
    
        var res = httpClient.GetAsync($"https://www.google.com/recaptcha/api/siteverify?secret=your secret key no quotes&response={gRecaptchaResponse}").Result;
    
        if (res.StatusCode != HttpStatusCode.OK) 
        {
            return false;
        }
        string JSONres = res.Content.ReadAsStringAsync().Result;
        dynamic JSONdata = JObject.Parse(JSONres);
    
        if (JSONdata.success != "true" || JSONdata.score <= 0.5m)
        {
            return false;
        }
    
        return true;
    }
    
  1. 最后,在您的OnPostAsync()处理程序内部,在顶部:

    if (!ModelState.IsValid) 
    {
        return Page();
    }
    else
    {
        if (!ReCaptchaPassed(Request.Form["foo"]))
        {
            ModelState.AddModelError(string.Empty, "You failed the CAPTCHA.");
            return Page();
        }
    }
    
于 2019-06-20T15:38:59.473 回答
15

编辑:我添加了一个演示项目。检查这个 github 存储库。 https://github.com/NIHAR-SARKAR/GoogleRecaptchav3-example-In-asp.net

从前端(.aspx 页面),您需要发送 ajax 请求以将令牌传递给后端服务器。使用“recaptcha.execute”你可以得到响应,并使用ajax请求传递令牌。请检查代码块。

 <script src="http://www.google.com/recaptcha/api.js?render=recaptchaSiteKey"></script>
<script>
 grecaptcha.ready(function() {
 grecaptcha.execute('recaptchaSiteKey', {action: 'homepage'}).then(function(token) {

            $.ajax({
                //pass the toket to Webmethod using Ajax
            });
          });
     });
</script>

参考链接: https ://developers.google.com/recaptcha/docs/verify https://developers.google.com/recaptcha/docs/display#js_api

现在在 aspx.cs 中,您需要编写一个“[WebMethod]”来接收来自 Ajax 请求的令牌。

    [WebMethod]
    public static void CaptchaVerify(string token)
    {
            var responseString = RecaptchaVerify(token);
            ResponseToken response = new ResponseToken();
            response = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseToken>(responseString.Result);

    }

要从 google recapcha api 获取响应,您需要使用 httpClient 使用异步调用。您还需要创建一个包含与响应字符串相同的属性的类。获得“responseString”后,您需要使用 Newtonsoft.Json 将响应转换为 ResponseToken 对象。 response = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseToken>(responseString.Result);

private string apiAddress = "https://www.google.com/recaptcha/api/siteverify";

private string recaptchaSecret = googleRecaptchaSecret;

        public async Task<string> RecaptchaVerify(string recaptchaToken)
        {
            string url = $"{apiAddress}?secret={recaptchaSecret}&response={recaptchaToken}";
            using (var httpClient = new HttpClient())
            {
                try
                {

                    string responseString=  httpClient.GetStringAsync(url).Result;
                    return responseString;

                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }


        public class ResponseToken
        {

            public DateTime challenge_ts { get; set; }
            public float score { get; set; }
            public List<string> ErrorCodes { get; set; }
            public bool Success { get; set; }
            public string hostname { get; set; }
        }
于 2019-03-28T05:37:27.907 回答
4

此页面上接受的答案是完全错误的!!!Google 返回一个介于 0 和 1 之间的分数,以表明提交的内容可能是机器人还是人类。

返回的success属性仅表示重新验证令牌已正确处理。

score应该检查的是属性,而不是success属性

这些行是问题

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

return true;

要比较的实际分数可能在一个可以根据需要进行调整的变量中。Google 建议从 0.5 开始。

因此代码应更改为:

var recaptchaScore = 0.5m; // this could be in appSettings or whereever/however you are storing your constants

if (JSONdata.success != "true" || JSONdata.score <= recaptchaScore)
    return false;

return true;

当然,您可能希望在此答案中添加日志记录等,但这是所需的基本逻辑。

于 2021-03-20T11:06:04.660 回答
2

有几个可用于 ASP.Net 的 Recaptcha 库。我选择使用reCAPTCHA.AspNetCore因为它提供了HtmlHelper

请注意,该库仅支持每页一个 ReCatpcha,并且不支持对非表单页面的 Recaptcha v3 被动监控。

于 2019-12-11T22:31:59.697 回答