Imports System Imports System.Configuration Imports System.IO Imports System.Net Imports System.Text Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Namespace Validators Public Class ReCaptchaValidator Inherits BaseValidator #Region "Fields" Protected dummy As New TextBox() #End Region #Region "Properties" ''' ''' Gets the Public Key generated by reCaptcha ''' Private Shared ReadOnly Property PublicKey() As String Get Return ConfigurationManager.AppSettings("publicKey") End Get End Property ''' ''' Gets the Private Key generated by reCaptcha ''' Private Shared ReadOnly Property PrivateKey() As String Get Return ConfigurationManager.AppSettings("privateKey") End Get End Property #End Region #Region "Private" ''' ''' Obtains the value of the passed key in the http form ''' ''' ''' Private Shared Function GetFormValue(ByVal value As String) As String Return HttpContext.Current.Request.Form(value) End Function ''' ''' Gathers the parameters for reCaptchaValidator ''' ''' Private Shared Function ReCaptchaParameters() As String Dim response As String = GetFormValue("recaptcha_response_field") Dim challenge As String = GetFormValue("recaptcha_challenge_field") Dim IP As String = HttpContext.Current.Request.UserHostName Dim builder As New StringBuilder() builder.AppendFormat("privatekey={0}&", PrivateKey) builder.AppendFormat("remoteip={0}&", IP) builder.AppendFormat("challenge={0}&", challenge) builder.AppendFormat("response={0}", response) Return builder.ToString() End Function ''' ''' Validates the capcha inserted by the user ''' ''' parameters to verify ''' response of the capcth Private Shared Function ValidateCaptcha(ByVal parameters As String) As String Try Dim request As WebRequest = WebRequest.Create("http://api-verify.recaptcha.net/verify") request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim writer As New StreamWriter(request.GetRequestStream()) writer.Write(parameters) writer.Close() 'Response Dim webResponse As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse) Dim myReader As New StreamReader(webResponse.GetResponseStream()) Dim response As String = myReader.ReadToEnd() myReader.Close() webResponse.Close() Return response Catch generatedExceptionName As WebException Return String.Empty End Try End Function #End Region #Region "Public" Protected Overloads Overrides Function EvaluateIsValid() As Boolean Dim parameters As String = ReCaptchaParameters() Dim result As String = ValidateCaptcha(parameters) Dim isValid As Boolean = result.Equals("true" & Chr(10) & "success") If Not isValid Then ErrorMessage = "Your are not a human!" Controls.Add(New LiteralControl(ErrorMessage)) End If Return isValid End Function #End Region #Region "Control Events" Protected Overloads Overrides Sub OnInit(ByVal e As EventArgs) dummy.ID = "aaa" Controls.Add(dummy) ControlToValidate = "aaa" MyBase.OnInit(e) End Sub ''' ''' Writes the to show the validation Captcha ''' ''' Protected Overloads Overrides Sub Render(ByVal writer As HtmlTextWriter) writer.Write("" & Chr(13) & "" & Chr(10) & "" & Chr(13) & "" & Chr(10) & "" & Chr(13) & "" & Chr(10) & "", PublicKey) dummy.Visible = False MyBase.Render(writer) End Sub #End Region End Class End Namespace