2009-08-11 6 views
2

Je viens d'installer reCaptcha sur mon site et mettre le contrôle sur mon commentaire, jusqu'ici tout va bien.Utiliser reCaptcha avec BlogEngine.net

Maintenant, pour valider reCaptcha, il suffit de faire Page.IsValid.

Cependant BlogEngine utilise Ajax et certains JS pour publier sa fonction addComment et si je le vérifie, j'obtiens juste une erreur sur la page dans la barre d'état.

Voici la fonction post bloengine -

/// <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(); 
    } 
} 

J'ai essayé simplement de mettre si le retour (Page.IsValid!); mais ça n'a jamais marché.

+0

Pouvez-vous s'il vous plaît poster le ASPX et tout code aspx.cs qui est lié à l'captcha ? Je connais assez bien DNBE car j'ai mon blog personnel et j'y ai écrit quelques extensions. –

Répondre

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(); 

Voici comment je l'ai fait sur un site différent. J'ai pris ce qui a été entré et la réponse et ai alors créé un nouveau captchaValidator qui a une méthode qui vérifiera si les réponses sont valides. Ensuite, utilisez cela comme votre booléen pour votre si.

J'utilise ASP.Net MVC. Mais, je suppose que l'idée est similaire.

Espérons que cela aide.

+0

Je trébuche ceci et bien que je pense que votre code soit correct (j'ai vérifié le débogueur) si je renvoie faux de ma méthode de commentaire la page casse en raison d'une erreur de JS. Je ne sais pas si c'est un problème avec ce que return1.at a dit dans le post ci-dessus. – ddd

+0

Je suis sûr que c'est le problème. Je sais juste que j'ai essayé de valider mon captcha de la même manière que vous l'avez fait et que j'ai dû le faire de cette façon pour obtenir le booléen dont j'avais besoin. J'espérais juste que cela vous mènerait dans la bonne direction. –

2

L'API par défaut de reCaptcha ne fonctionne pas avec les pages Web pilotées par AJAX, en particulier lorsque vous remplacez le contenu, où réside la reCaptcha. Le problème ici est l'API reCaptcha par défaut. Il suffit de passer à l'API AJAX, qui est également offert here

+0

Si j'utilise seulement l'API Ajax, les spammeurs ne pourraient-ils pas simplement désactiver JS et cela le contournerait? – ddd

+0

Je suppose que je devrais vérifier le code BlogEngine et voir s'il y a une méthode de publication normale pour les commentaires et mettre l'API par défaut dedans? – ddd

+0

L'envoi de pages avec des pages ajax ne fonctionnerait pas, si vous désactivez JS afin qu'il ne soit pas ignoré. J'irais pour l'API ajax (comme je l'ai fait avec un de mes sites). –

Questions connexes