2009-08-11 4 views
2

Ich habe gerade reCaptcha auf meiner Website installiert und setzen Sie die Kontrolle auf meine Kommentar-Post, soweit so gut.Verwenden von reCaptcha mit BlogEngine.net

Nun zu validieren reCaptcha sagt es einfach tun Page.IsValid.

Allerdings verwendet BlogEngine Ajax und einige JS, um seine addComment-Funktion zu veröffentlichen, und wenn ich das teste, erhalte ich nur Fehler auf der Seite in der Statusleiste. Hier

ist die bloengine Post-Funktion -

/// <summary> 
/// Processes a callback event that targets a control. 
/// </summary> 
/// <param name="eventArgument">A string that represents an event argument to pass to the event handler.</param> 
public void RaiseCallbackEvent(string eventArgument) 
{ 
    if (!BlogSettings.Instance.IsCommentsEnabled) 
     return; 

    string[] args = eventArgument.Split(new string[] { "-|-" }, StringSplitOptions.None); 
    string author = args[0]; 
    string email = args[1]; 
    string website = args[2]; 
    string country = args[3]; 
    string content = args[4]; 
    bool notify = bool.Parse(args[5]); 
    bool isPreview = bool.Parse(args[6]); 
    string sentCaptcha = args[7]; 
    //If there is no "reply to" comment, args[8] is empty 
    Guid replyToCommentID = String.IsNullOrEmpty(args[8]) ? Guid.Empty : new Guid(args[8]); 

    string storedCaptcha = hfCaptcha.Value; 

    Comment comment = new Comment(); 
    comment.Id = Guid.NewGuid(); 
    comment.ParentId = replyToCommentID; 
    comment.Author = Server.HtmlEncode(author); 
    comment.Email = email; 
    comment.Content = Server.HtmlEncode(content); 
    comment.IP = Request.UserHostAddress; 
    comment.Country = country; 
    comment.DateCreated = DateTime.Now; 
    comment.Parent = Post; 
    comment.IsApproved = !BlogSettings.Instance.EnableCommentsModeration; 

    if (Page.User.Identity.IsAuthenticated) 
     comment.IsApproved = true; 

    if (website.Trim().Length > 0) 
    { 
     if (!website.ToLowerInvariant().Contains("://")) 
      website = "http://" + website; 

     Uri url; 
     if (Uri.TryCreate(website, UriKind.Absolute, out url)) 
      comment.Website = url; 
    } 

    if (notify && !Post.NotificationEmails.Contains(email)) 
     Post.NotificationEmails.Add(email); 
    else if (!notify && Post.NotificationEmails.Contains(email)) 
     Post.NotificationEmails.Remove(email); 

    if (!isPreview) 
    { 
     Post.AddComment(comment); 
     SetCookie(author, email, website, country); 
    } 

    string path = Utils.RelativeWebRoot + "themes/" + BlogSettings.Instance.Theme + "/CommentView.ascx"; 

    CommentViewBase control = (CommentViewBase)LoadControl(path); 
    control.Comment = comment; 
    control.Post = Post; 

    using (StringWriter sw = new StringWriter()) 
    { 
     control.RenderControl(new HtmlTextWriter(sw)); 
     _Callback = sw.ToString(); 
    } 
} 

Ich versuchte nur darum, wenn Rückkehr (Page.IsValid!); aber das hat nie funktioniert.

+0

Können Sie bitte die ASPX und jede aspx.cs Code schreiben, die das Captcha angeboten wird verwandt ? Ich bin ziemlich vertraut mit DNBE, da ich meinen persönlichen Blog verwende und einige Erweiterungen dafür geschrieben habe. –

Antwort

1
var captchaChallengeValue = filterContext.HttpContext.Request.Form["recaptcha_challenge_field"]; 
var captchaResponseValue = filterContext.HttpContext.Request.Form["recaptcha_response_field"]; 
var captchaValidator = new Recaptcha.RecaptchaValidator 
{ 
    PrivateKey = "private key here", 
    RemoteIP = filterContext.HttpContext.Request.UserHostAddress, 
    Challenge = captchaChallengeValue, 
    Response = captchaResponseValue 
}; 

var recaptchaResponse = captchaValidtor.Validate(); 

Dies ist, wie ich es auf einer anderen Website gemacht habe. Ich nahm, was eingegeben wurde und die Antwort und dann erstellt einen neuen CaptchaValidator, der eine Methode hat, die überprüft, ob die Antworten gültig sind. Dann benutze das als deinen booleschen Wert für dein if.

Ich benutze ASP.Net MVC. Aber ich würde annehmen, dass die Idee ähnlich ist.

Hoffe, das hilft.

+0

Ich treid das und obwohl ich denke, dass Ihr Code korrekt ist (ich überprüfte den Debugger), wenn ich falsch von meiner Kommentarmethode zurückgibt, bricht die Seite wegen eines JS-Fehlers. Ich weiß nicht, ob das ein Problem ist mit dem, was return1.at in dem Beitrag oben gesagt hat. – ddd

+0

Ich bin mir sicher, dass das das Problem ist. Ich weiß nur, dass ich versucht habe, mein Captcha auf die gleiche Weise zu validieren, wie du es getan hast, und ich musste es auf diese Weise tun, um den booleschen Wert zu erhalten, den ich brauchte. Hatte nur gehofft, dass es dich in die richtige Richtung bringen würde. –

2

reCaptchas Standard-API funktioniert nicht mit AJAX-gesteuerten Webseiten, insbesondere wenn Sie den Inhalt ersetzen, in dem sich der reCaptcha befindet. Das Problem hier ist die Standard ReCaptcha API. Schalten Sie einfach auf die AJAX-API, die auch here

+0

Wenn ich nur die Ajax-API verwende, würden Spammer nicht in der Lage sein, JS einfach zu deaktivieren, und das würde es umgehen? – ddd

+0

Ich denke, ich sollte den BlogEngine-Code überprüfen und sehen, ob es eine normale Post-Methode für Kommentare gibt und die Standard-API dort eingeben? – ddd

+0

Die Seite, die mit Ajax-Seiten gesendet wird, funktioniert nicht, wenn Sie JS deaktivieren, damit es nicht umgangen wird. Ich würde für die Ajax API gehen (wie ich es mit einer meiner Websites getan habe). –