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