2017-06-29 3 views
2

Das ist mein ASP.NET-Formular. Ich möchte es mit der serverseitigen Validierung unsichtbar recaptcha hinzufügen. Kann mir bitte jemand helfen?Umsetzung Invisible Google ReCaptcha für asp.net-Anwendung?

Ich kann clientseitige Validierung durchführen, aber es verwendet keinen geheimen Schlüssel. Meine anderen Fragen sind: Brauchen wir einen geheimen Schlüssel für unsichtbares Recaptcha?

Bitte lesen Sie den Servercode, den ich für Google Recaptcha verwendet habe, aber er funktioniert nicht für Invisible recaptcha. Ich erhalte diese Fehlermeldung: - reCAPTCHA Fehler: fehlende-input-Antwort: Unzulässig Recaptcha

<div id="ContactFormDiv" runat="server"> 
    <div class="form-row form-required"> 
     <asp:Label ID="YourNameLabel" runat="server" AssociatedControlID="YourNameTextBox"> Your Name:</asp:Label> 
     <asp:TextBox ID="YourNameTextBox" runat="server" CssClass="form300" MaxLength="150"></asp:TextBox> 
    </div> 
    <div class="form-row form-required"> 
      <div id='recaptcha' class="g-recaptcha" 
       data-sitekey="site key" 
       data-callback="onSubmit" 
       data-size="invisible"> 
      </div> 
    </div> 
    <div class="form-row-buttons"> 
     <asp:Button ID="SendMessageButton" ClientIDMode="Static" runat="server" Text="Send Message" CssClass="buttonPositive" 
      CausesValidation="True" OnClick="SendMessageButton_Click" /> 
    </div> 
</div> 

Javascript-Code

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

Serverside-Code

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

public static string ReCaptcha_Key = "------------------Site Key-----------------"; 
public static string ReCaptcha_Secret = "--------------Secret Key ---------------"; 

public bool ValidateReCaptcha() 
{ 
    bool Valid = false; 
    //start building recaptch api call 
    var sb = new StringBuilder(); 

    //Getting Response String Append to Post Method 
    string Response = Request["g-recaptcha-response"]; 

    string url = "https://www.google.com/recaptcha/api/siteverify?secret=" + ReCaptcha_Secret + "&response=" + Response; 
    sb.Append(url); 

    //make the api call and determine validity 
    using (var client = new WebClient()) 
    { 
     var uri = sb.ToString(); 
     var json = client.DownloadString(uri); 
     var serializer = new DataContractJsonSerializer(typeof(RecaptchaApiResponse)); 
     var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); 
     var result = serializer.ReadObject(ms) as RecaptchaApiResponse; 

     //--- Check if we are able to call api or not. 
     if (result == null) 
     { 
      lblmsg.Text = "Captcha was unable to make the api call"; 
     } 
     else // If Yes 
     { 
      //api call contains errors 
      if (result.ErrorCodes != null) 
      { 
       if (result.ErrorCodes.Count > 0) 
       { 
        foreach (var error in result.ErrorCodes) 
        { 
         lblmsg.Text = "reCAPTCHA Error: " + error; 
        } 
       } 
      } 
      else //api does not contain errors 
      { 
       if (!result.Success) //captcha was unsuccessful for some reason 
       { 
        lblmsg.Text = "Captcha did not pass, please try again."; 
       } 
       else //---- If successfully verified. Do your rest of logic. 
       { 
        lblmsg.Text = "Captcha cleared "; 
        Valid = true; 
       } 
      } 
     } 
    } 
    return Valid; 
} 

public bool temp = true; 
protected void SendMessageButton_Click(object sender, EventArgs e) 
{ 
    temp = ValidateReCaptcha(); 
    if (temp == false) 
    { 
     lblmsg.Text = "Not Valid Recaptcha"; 
     lblmsg.ForeColor = System.Drawing.Color.Red; 
    } 
    else 
    { 
     lblmsg.Text = "Successful"; 
     lblmsg.ForeColor = System.Drawing.Color.Green; 
    } 

    Page.Validate(); 

    if (this.Page.IsValid == true && temp == true) 
    { //Page and invisible recaptcha is valid } 
} 

Ich erhalte Dieser Fehler: - reCAPTCHA Fehler: fehlende Eingabe-Antwort: Nicht Val ID Recaptcha

+0

Invisible reCaptcha? Das macht keinen Sinn. Widerspricht das nicht dem Verwendungszweck? – VDWWD

+2

@VDWWD Bitte suchen Sie Google Unsichtbar reCaptcha https://developers.google.com/recaptcha/docs/invisible –

+0

ok ... Es existiert. Das tut mir leid. Der einzige Unterschied ist, dass Sie nicht auf das Kontrollkästchen klicken müssen, aber der Rest scheint derselbe zu sein, und wenn es Ihnen immer noch nicht vertraut, wird es immer noch die Validierung zeigen. – VDWWD

Antwort

0

Ich habe auch ähnliches Problem und es sieht so aus, als ob es schwieriger ist, irgendein anständiges Beispiel zu finden. Allerdings habe ich gesehen, dass Sie data-callback = "onSubmit" gesetzt haben, aber ich habe nicht gesehen, wo Sie diese Methode definiert haben. Ist es da? Könnte das sein, was vermisst du? Diese

1

ist, wie ich die Arbeitsprobe umgesetzt:

- Client Side (Siehe Google Documentation)

<head> 
 
\t <!-- Google Invisible Captcha --> 
 
\t <script src='https://www.google.com/recaptcha/api.js'/> 
 
\t <script> 
 
     function onSubmit(token) { 
 
      document.getElementById("htmlForm").submit(); 
 
     } 
 
\t </script> 
 
</head> 
 
<body> 
 
\t <form id="htmlForm" action="Default.aspx" method="post"> 
 
\t \t <input name="txtName" /> 
 
\t \t <input name="txtEmailAddress" /> 
 
\t \t <button class="g-recaptcha btn btn-default" 
 
        data-sitekey="-------------------Site key--------------" 
 
        data-callback="onSubmit"> 
 
        Submit Request 
 
\t \t </button> 
 
\t </form> 
 
</body>

- Server Side

public static bool IsValidCaptcha() 
    { 

     var secret = "--------------Secret Key ---------------"; 
     var req = 
      (HttpWebRequest) 
       WebRequest.Create("https://www.google.com/recaptcha/api/siteverify" + secret + "?secret=&response=" + HttpContext.Current.Request.Form["g-recaptcha-response"]); 

     using (var wResponse = req.GetResponse()) 
     { 

      using (StreamReader readStream = new StreamReader(wResponse.GetResponseStream())) 
      { 
       string responseFromServer = readStream.ReadToEnd(); 
       if (!responseFromServer.Contains("\"success\": false")) 
        return true; 
      } 
     } 

     return false; 

    } 
+0

Vielen Dank Barsham, ich werde versuchen, dies auszuführen . –