2014-12-27 5 views
8

Ich benutze ASP.Net MVC zu und versuche, ein Google ReCaptcha Objekt in eine Seite zu implementieren.ASP.Net MVC Recaptcha Jquery Ajax Problem

Ich versuche, die Verwendung von Modellen in meinen Formularen zu vermeiden, und möchte direkt eine Methode aufrufen, die jquery ajax verwendet.

Ich habe das Captcha zu erscheinen, aber was auch immer ich eingeben erscheint als Null beim Inspizieren der RecaptchaVerificationHelper Objekt im Debugger.

Irgendwelche Vorschläge, um es leicht zu halten, wie ich es habe, aber es funktioniert.

Hinweis: Der Großteil der Logik wurde hier entfernt, nur um die Captcha-Logik zu erhalten.

CSHTML Probe:

@using Recaptcha.Web.Mvc; 

<script type="text/javascript"> 
function createUser() { 

      $.ajax({ 
       type: "POST", 
       url: 'CreateUser', 
       contentType: "application/json; charset=utf-8", 
       success: function (response) { 
        if (response.Success == true) { 
         alert("success"); 
         //redirectSuccess(); 
        } else { 
         alert("failed"); 
        } 
       }, 
       error: function (err) { 
        commonError(err); 
       } 
      }); 

    } 
</script> 

@Html.Recaptcha(publicKey: "6LdxcPgSAA...", theme: Recaptcha.Web.RecaptchaTheme.Clean); 
<br /> 
<input type="button" value="Submit" onclick="createUser();" style="margin-right:300px;" /> 

CS Server-Code-Beispiel:

public ActionResult User() 
     { 
      return View(); 
     } 

public JsonResult CreateUser() 
     { 
      Wrapper.ValidationResponse response = new Wrapper.ValidationResponse(); 
      response.Success = true; 

      RecaptchaVerificationHelper recaptchaHelper = this.GetRecaptchaVerificationHelper(); 

      if (String.IsNullOrEmpty(recaptchaHelper.Response)) 
      { 

       response.Success = false; 
      } 

      RecaptchaVerificationResult recaptchaResult = recaptchaHelper.VerifyRecaptchaResponse(); 

      if (recaptchaResult != RecaptchaVerificationResult.Success) 
      { 
       response.Success = false; 
      } 

       try 
       { 
        //removed logic 
        return Json(response); 
       } 
       catch (Exception ex) 
       { 
        response.Success = false; 
        response.Message = "Failed to create new user. Please contact us if the issue persists."; 
        return Json(response); 
       } 
     } 

Vielen Dank im Voraus,

+0

NuGet ** Google reCAPTCHA V2 ** für MVC 4 und 5 - [NuGet Package] (https: //www.nuget. org/packages/reCAPTCH.MVC /) - [Demo und Dokument] (http://recaptchamvc.apphb.com/) – Sender

Antwort

7

Nachdem ich seit über einer Woche verrückt geworden bin, habe ich endlich eine funktionierende Lösung direkt mit der Entwickler API.

Was ich getan habe, war die jsAPI verwenden und manuell das Captcha-Steuerelement über die API auf der Seite hinzufügen. Beim Senden habe ich die Recaptcha-Antwort erfasst und die Server-Seite gesendet.

Von Server-Seite habe ich dann die Anfrage nach den API-Anweisungen validiert und mit diesem Tutorial hier gefunden: http://www.codeproject.com/Tips/851004/How-to-Validate-Recaptcha-V-Server-side Ich schickte dann die Anfrage und behandelt die Antwort entsprechend.

HTML:

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

<script type="text/javascript"> 
    var captcharesponse = grecaptcha.getResponse(); 


      $.ajax({ 
       type: "POST", 
       url: 'CreateUser', 

       data: "{captcharesponse:" + JSON.stringify(captcharesponse) + "}", 
       contentType: "application/json; charset=utf-8", 
       success: function (response) { 

        if (response.Success == true) { 
         alert("success"); 

        } else { 
         alert("failed"); 

        } 

       }, 
       error: function (err) { 
        commonError(err); 
       } 
      }); 
     } 
</script> 

<div class="g-recaptcha" 
       data-sitekey="[public key here]"></div> 
      <br /> 
<input type="button" value="Submit" onclick="createUser();" style="margin-right:300px;" /> 

CS:

[HttpPost] 
     public JsonResult CreateUser(string captcharesponse) 
     { 
      Wrapper.ValidationResponse response = new Wrapper.ValidationResponse(); 
      response.Success = true; 

      if (Recaptcha.Validate.Check(captcharesponse) == false) 
      { 
       response.Success = false; 
      } 

       try 
       { 
        //removed logic 
        return Json(response); 
       } 
       catch (Exception ex) 
       { 
        response.Success = false; 
        response.Message = "Failed to create new user. Please contact us if the issue persists."; 
        return Json(response); 
       } 
     } 



public class Validate 
    { 
     public static bool Check(string response) 
     { 
      //string Response = HttpContext.Current.Request.QueryString["g-recaptcha-response"];//Getting Response String Append to Post Method 
      bool Valid = false; 
      //Request to Google Server 
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create 
      (" https://www.google.com/recaptcha/api/siteverify?secret=" + WebConfigurationManager.AppSettings["recaptchaPrivateKey"] + "&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(); 
         MyObject data = js.Deserialize<MyObject>(jsonResponse);// Deserialize Json 

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

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

    public class MyObject 
    { 
     public string success { get; set; } 
    } 
1

Ihre Controller-Methode

public JsonResult CreateUser() //<-- CamelCase 

nicht mit Ajax-Aufruf überein

+0

War ein Tippfehler bei der Eingabe der Frage, bearbeitet und behoben in Frage. Das Lesen der Frage wird Ihnen sagen, dass dies nicht das Problem ist. Ich komme schon in die Funktion. – Cyassin