使用ASP.Net的新Google Recaptcha

Ste*_*eve 5 vb.net asp.net recaptcha

我试图让新的Google reCaptcha在我的ASP.NET项目中工作,我遇到了问题,让它成为新的"我不是机器人".

我在那里有旧的,在对developers.google.com网站进行了大量研究后,一切看起来都一样(他们甚至指向我下载相同的dll - 1.0.5).所以,我得到了新的密钥并将它们放入并且它可以工作,但它看起来就像旧的reCaptcha.

有没有人得到新的ASP.Net工作?我错过了什么?

编辑:

因此,在测试应用程序中搜索并搜索其他一些网站,我发现如果我创建这样的页面:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>reCAPTCHA demo: Simple page</title>
     <script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
    <form id="form1" runat="server" action="?" method="POST">
    <div>
    <div class="g-recaptcha" data-sitekey="My Public Key"></div>
      <br/>
        <asp:Button ID="Button1" runat="server" Text="Submit" />

    </div>
    </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

然后在我的代码隐藏(Button1_Click)中,我这样做:

Dim Success As Boolean
Dim recaptchaResponse As String = request.Form("g-recaptcha-response")
If Not String.IsNullOrEmpty(recaptchaResponse) Then
    Success = True
Else
    Success = False
End If
Run Code Online (Sandbox Code Playgroud)

recaptchaResponse要么是空的或填充取决于他们是否是僵尸或没有.问题是,我现在需要把这个回复用私钥发送给google,这样我就可以验证响应是不是由机器人提供的,在我的代码隐藏中,但我无法弄清楚如何.我试过这个(取代Success = True):

Dim client As New System.Net.Http.HttpClient()
client.BaseAddress = New Uri("https://www.google.com/recaptcha/")
client.DefaultRequestHeaders.Accept.Clear()
client.DefaultRequestHeaders.Accept.Add(New Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"))

Dim response As Net.Http.HttpResponseMessage = Await client.GetAsync("api/siteverify?secret=My Private key&response=" + recaptchaResponse)
If (response.IsSuccessStatusCode) Then
    Dim CaptchResponse As ReCaptchaModel = Await response.Content.ReadAsAsync(Of ReCaptchaModel)()
    Success = CaptchResponse.success
Else
    Success = False
End If
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何让异步的东西工作,我找不到什么是什么ReCaptchaModel,所以我找到另一种方法来调用Web服务并得到一个json响应并尝试这样做:

Dim request As Net.WebRequest = Net.WebRequest.Create("https://www.google.com/recaptcha/")
Dim Data As String = "api/siteverify?secret=My Private Key&response=" + recaptchaResponse
request.Method = "POST"
request.ContentType = "application/json; charset=utf-8"
Dim postData As String = "{""data"":""" + Data + """}"
'get a reference to the request-stream, and write the postData to it
Using s As IO.Stream = request.GetRequestStream()
    Using sw As New IO.StreamWriter(s)
        sw.Write(postData)
    End Using
End Using
'get response-stream, and use a streamReader to read the content
Using s As IO.Stream = request.GetResponse().GetResponseStream()
    Using sr As New IO.StreamReader(s)
        'decode jsonData with javascript serializer
        Dim jsonData = sr.ReadToEnd()
        Stop
    End Using
End Using
Run Code Online (Sandbox Code Playgroud)

但是,这只是通过https://www.google.com/recaptcha向我提供了该网页的内容.不是我想要的.在谷歌网页是不是非常有用,我被困在哪里去了.我需要一些帮助,要么调用Google验证服务,要么是否有人从ASP.NET找到了另一种方法.

Ste*_*eve 8

当我碰到一些不相关的东西时,我只是放弃了,这让我再次以不同的方式思考它.在我上面的最后一次尝试中,我试图将私钥和recaptcha响应作为数据传递,所以我create在WebRequest中尝试了它并且它有效.这是最终的解决方案:

使用上面发布的相同的HTML,我创建了一个函数,我可以在按钮单击事件中调用,我检查Page.IsValid并调用此函数:

Private Function IsGoogleCaptchaValid() As Boolean
    Try
        Dim recaptchaResponse As String = Request.Form("g-recaptcha-response")
        If Not String.IsNullOrEmpty(recaptchaResponse) Then
            Dim request As Net.WebRequest = Net.WebRequest.Create("https://www.google.com/recaptcha/api/siteverify?secret=My Private Key&response=" + recaptchaResponse)
            request.Method = "POST"
            request.ContentType = "application/json; charset=utf-8"
            Dim postData As String = ""

            'get a reference to the request-stream, and write the postData to it
            Using s As IO.Stream = request.GetRequestStream()
                Using sw As New IO.StreamWriter(s)
                    sw.Write(postData)
                End Using
            End Using
            ''get response-stream, and use a streamReader to read the content
            Using s As IO.Stream = request.GetResponse().GetResponseStream()
                Using sr As New IO.StreamReader(s)
                    'decode jsonData with javascript serializer
                    Dim jsonData = sr.ReadToEnd()
                    If jsonData = "{" & vbLf & "  ""success"": true" & vbLf & "}" Then
                        Return True
                    End If
                End Using
            End Using
        End If
    Catch ex As Exception
        'Dont show the error
    End Try
    Return False
End Function
Run Code Online (Sandbox Code Playgroud)

我确信代码有所改进,但它确实有效.我看不到添加一些JSON库的引用来读取一个我只检查字符串的东西.