/// <summary>
        /// Captcha validator.
        /// </summary>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.CheckArgumentNull(nameof(filterContext));

            var httpContext = filterContext.HttpContext;

            httpContext.CheckArgumentNull(nameof(httpContext));


            var validatorService = httpContext.RequestServices.GetService <IDNTCaptchaValidatorService>();

            if (validatorService.HasRequestValidCaptchaEntry(
                    CaptchaGeneratorLanguage,
                    CaptchaGeneratorDisplayMode,
                    filterContext.ActionArguments.Select(item => item.Value).OfType <DNTCaptchaBase>().FirstOrDefault()))
            {
                base.OnActionExecuting(filterContext);
                return;
            }

            var controllerBase = filterContext.Controller as ControllerBase;

            controllerBase.CheckArgumentNull(nameof(controllerBase));

            controllerBase.ModelState.AddModelError(DNTCaptchaTagHelper.CaptchaInputName, ErrorMessage);
            base.OnActionExecuting(filterContext);
        }
Пример #2
0
        /// <summary>
        /// Captcha validator.
        /// </summary>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.CheckArgumentNull(nameof(filterContext));

            var httpContext = filterContext.HttpContext;

            httpContext.CheckArgumentNull(nameof(httpContext));

            var(captchaText, inputText, cookieToken) = getFormValues(filterContext);
            var validatorService = httpContext.RequestServices.GetService <IDNTCaptchaValidatorService>();
            var result           = validatorService.Validate(
                httpContext,
                captchaText,
                inputText,
                cookieToken,
                CaptchaGeneratorLanguage,
                ErrorMessage,
                IsNumericErrorMessage,
                deleteCookieAfterValidation: true);

            if (result.IsValid)
            {
                base.OnActionExecuting(filterContext);
                return;
            }

            var controllerBase = filterContext.Controller as ControllerBase;

            controllerBase.CheckArgumentNull(nameof(controllerBase));

            controllerBase.ModelState.AddModelError(DNTCaptchaTagHelper.CaptchaInputName, result.ErrorMessage);
            base.OnActionExecuting(filterContext);
        }
        /// <summary>
        /// Captcha validator.
        /// </summary>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.CheckArgumentNull(nameof(filterContext));

            var loggerFactory = filterContext.HttpContext.RequestServices.GetService <ILoggerFactory>();
            var logger        = loggerFactory.CreateLogger <ValidateCaptchaAttribute>();

            if (!shouldValidate(filterContext))
            {
                logger.LogWarning($"Ignoring ValidateCaptcha during `{filterContext.HttpContext.Request.Method}`.");
                base.OnActionExecuting(filterContext);
                return;
            }

            var controllerBase = filterContext.Controller as ControllerBase;

            controllerBase.CheckArgumentNull(nameof(controllerBase));

            var form = filterContext.HttpContext.Request.Form;

            form.CheckArgumentNull(nameof(form));

            var captchaText = (string)form[CaptchaTagHelper.CaptchaHiddenInputName];

            if (string.IsNullOrWhiteSpace(captchaText))
            {
                logger.LogWarning("CaptchaHiddenInput is empty.");
                controllerBase.ModelState.AddModelError(CaptchaTagHelper.CaptchaInputName, ErrorMessage);
                base.OnActionExecuting(filterContext);
                return;
            }

            var inputText = (string)form[CaptchaTagHelper.CaptchaInputName];

            if (string.IsNullOrWhiteSpace(inputText))
            {
                logger.LogWarning("CaptchaInput is empty.");
                controllerBase.ModelState.AddModelError(CaptchaTagHelper.CaptchaInputName, ErrorMessage);
                base.OnActionExecuting(filterContext);
                return;
            }

            long inputNumber;

            if (!long.TryParse(inputText, out inputNumber))
            {
                logger.LogWarning("inputText is not a number.");
                controllerBase.ModelState.AddModelError(CaptchaTagHelper.CaptchaInputName, IsNumericErrorMessage);
                base.OnActionExecuting(filterContext);
                return;
            }

            var captchaEncryption = filterContext.HttpContext.RequestServices.GetService <ICaptchaProtectionProvider>();
            var decryptedText     = captchaEncryption.Decrypt(captchaText);

            var humanReadableIntegerProvider = filterContext.HttpContext.RequestServices.GetService <IHumanReadableIntegerProvider>();
            var numberToText = humanReadableIntegerProvider.NumberToText(inputNumber, CaptchaGeneratorLanguage);

            if (decryptedText == null || !decryptedText.Equals(numberToText))
            {
                logger.LogWarning($"{decryptedText} != {numberToText}");
                controllerBase.ModelState.AddModelError(CaptchaTagHelper.CaptchaInputName, ErrorMessage);
                base.OnActionExecuting(filterContext);
                return;
            }

            if (!isValidCookie(filterContext.HttpContext, decryptedText, logger))
            {
                controllerBase.ModelState.AddModelError(CaptchaTagHelper.CaptchaInputName, ErrorMessage);
                base.OnActionExecuting(filterContext);
                return;
            }

            base.OnActionExecuting(filterContext);
        }