Search code examples
c#asp.netvb.netrecaptcha

Validating Recaptcha 2 (No CAPTCHA reCAPTCHA) in ASP.NET's server side


The new Recaptcha 2 looks promising, but i didn't find a way to validate it in ASP.NET's server side,

if(Page.IsValid) in This answer, is valid for the old Recaptcha, but not the new one,

How to validate the new reCAPTCHA in server side?


Solution

  • After reading many resources, I ended up with writing this class to handle the validation of the new ReCaptcha :

    As mentioned Here : When a reCAPTCHA is solved by end user, a new field (g-recaptcha-response) will be populated in HTML.

    We need to read this value and pass it to the class below to validate it:

    In C#:

    In the code behind of your page :

    string EncodedResponse = Request.Form["g-Recaptcha-Response"];
    bool IsCaptchaValid = (ReCaptchaClass.Validate(EncodedResponse) == "true" ? true : false);
    
    if (IsCaptchaValid) {
        //Valid Request
    }
    

    The Class:

      using Newtonsoft.Json;
    
        public class ReCaptchaClass
        {
            public static string Validate(string EncodedResponse)
            {
                var client = new System.Net.WebClient();
    
                string PrivateKey = "6LcH-v8SerfgAPlLLffghrITSL9xM7XLrz8aeory";
    
                var GoogleReply = client.DownloadString(string.Format("https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}", PrivateKey, EncodedResponse));
    
                var captchaResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<ReCaptchaClass>(GoogleReply);
    
                return captchaResponse.Success.ToLower();
            }
    
            [JsonProperty("success")]
            public string Success
            {
                get { return m_Success; }
                set { m_Success = value; }
            }
    
            private string m_Success;
            [JsonProperty("error-codes")]
            public List<string> ErrorCodes
            {
                get { return m_ErrorCodes; }
                set { m_ErrorCodes = value; }
            }
    
    
            private List<string> m_ErrorCodes;
        }
    

    In VB.NET:

    In the code behind of your page :

    Dim EncodedResponse As String = Request.Form("g-Recaptcha-Response")
        Dim IsCaptchaValid As Boolean = IIf(ReCaptchaClass.Validate(EncodedResponse) = "True", True, False)
    
        If IsCaptchaValid Then
            'Valid Request
        End If
    

    The Class:

    Imports Newtonsoft.Json
    
    
    Public Class ReCaptchaClass
        Public Shared Function Validate(ByVal EncodedResponse As String) As String
            Dim client = New System.Net.WebClient()
    
            Dim PrivateKey As String = "6dsfH-v8SerfgAPlLLffghrITSL9xM7XLrz8aeory"
    
            Dim GoogleReply = client.DownloadString(String.Format("https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}", PrivateKey, EncodedResponse))
    
            Dim captchaResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(Of ReCaptchaClass)(GoogleReply)
    
            Return captchaResponse.Success
        End Function
    
        <JsonProperty("success")> _
        Public Property Success() As String
            Get
                Return m_Success
            End Get
            Set(value As String)
                m_Success = value
            End Set
        End Property
        Private m_Success As String
    
        <JsonProperty("error-codes")> _
        Public Property ErrorCodes() As List(Of String)
            Get
                Return m_ErrorCodes
            End Get
            Set(value As List(Of String))
                m_ErrorCodes = value
            End Set
        End Property
    
        Private m_ErrorCodes As List(Of String)
    
    End Class