2010-08-23 13 views
0

J'utilise MvcRecaptcha pour empêcher les publications de bot pour un formulaire client complexe non authentifié sur un site ASP.NET MVC 2.0.Demande de CAPTCHA une seule fois avec MvcReCaptcha

Je veux seulement exiger une entrée CAPTCHA correcte d'un client non authentifié, même si certaines des entrées du formulaire sont incorrectes.

J'ai essayé d'utiliser une variable Session["CaptchaSuccess"] = true; pour supprimer Html.GenerateCaptcha() à mon avis après une entrée réussie, mais la présence de l'attribut [CaptchaValidator] sur mon [HttpPost] vue provoque une erreur, car il nécessite naturellement des entrées de forme ReCaptcha.

Quelle est la manière la plus simple d'y parvenir de manière fiable, y compris sur les navigateurs mobiles?

Répondre

0

résolu en modifiant la méthode de [CaptchaValidatorAttribute] OnActionExecuting, où CaptchaSuccessFieldKey se réfère à la valeur de chaîne constante "CaptchaSuccess":

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
      bool? bCaptchaSuccess = filterContext.HttpContext.Session[CaptchaSuccessFieldKey] as bool?; 
      if (bCaptchaSuccess.HasValue && bCaptchaSuccess.Value) 
      { 
       filterContext.ActionParameters["captchaValid"] = true; 
      } 
      else 
      { 

       var captchaChallengeValue = filterContext.HttpContext.Request.Form[ChallengeFieldKey]; 
       var captchaResponseValue = filterContext.HttpContext.Request.Form[ResponseFieldKey]; 
       var captchaValidtor = new Recaptcha.RecaptchaValidator 
              { 
               PrivateKey = ConfigurationManager.AppSettings["ReCaptchaPrivateKey"], 
               RemoteIP = filterContext.HttpContext.Request.UserHostAddress, 
               Challenge = captchaChallengeValue, 
               Response = captchaResponseValue 
              }; 

       var recaptchaResponse = captchaValidtor.Validate(); 

       // this will push the result value into a parameter in our Action 
       filterContext.ActionParameters["captchaValid"] = recaptchaResponse.IsValid; 
      } 

      base.OnActionExecuting(filterContext); 

      // Add string to Trace for testing 
      //filterContext.HttpContext.Trace.Write("Log: OnActionExecuting", String.Format("Calling {0}", filterContext.ActionDescriptor.ActionName)); 
     }