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找到了另一种方法.
当我碰到一些不相关的东西时,我只是放弃了,这让我再次以不同的方式思考它.在我上面的最后一次尝试中,我试图将私钥和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库的引用来读取一个我只检查字符串的东西.
| 归档时间: |
|
| 查看次数: |
8454 次 |
| 最近记录: |