Запрашивать CAPTCHA только один раз с MvcReCaptcha - PullRequest
0 голосов
/ 24 августа 2010

Я использую MvcRecaptcha для предотвращения сообщений ботов для сложной неаутентифицированной клиентской формы на сайте ASP.NET MVC 2.0.

Мне требуется только одна правильная запись CAPTCHA от неаутентифицированного клиента, даже если некоторые из входных данных формы неверны.

Я пытался использовать переменную Session["CaptchaSuccess"] = true; для подавления Html.GenerateCaptcha() в моем представлении после успешной записи, но наличие атрибута [CaptchaValidator] в моем представлении [HttpPost] вызывает ошибку, поскольку, естественно, требуется некоторая форма ReCaptcha входы.

Какой самый простой способ добиться этого надежно, в том числе в мобильных браузерах?

1 Ответ

0 голосов
/ 24 августа 2010

Решено путем изменения метода [CaptchaValidatorAttribute] OnActionExecuting, где CaptchaSuccessFieldKey относится к константному строковому значению "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));
        }
...