ASP.NET MVC: Кто ты милый человек или используем Captcha из MvcTools
Проверить является ли реальным человеком отправитель формы ввода можно запросив на форме специальный код написанный на картинке, робот его не увидит. При отправке формы если код отсутствует - форма некорректна.
Постановка задачи
Требуется проверить на то тот факт, что именно реальный человек отправляет форму на сервер, а не какой-нибудь робот. Так как существует множество сторонних библиотек и расширений, я решил добавить такой функционал и в свою Calabonga.Mvc.Extensions, которая устанавливается через nuget-пакет MvcTools.
Установливаем пакет
Для установки nuget-пакета используем команду, которую вводим в Nuget Manager Console:
PM> Install-Package mvctools Attempting to resolve dependency 'XmlExport (? 0.2.1)'. 'MvcTools 1.7.0' already installed. MvcCaptchaDemo already has a reference to 'MvcTools 1.7.0'. PM> Install-Package mvctools
Пример использования captcha
Для примера я снова буду использовать форму обратной связи. И форма простая, и ViewModel’ы уже для нее имеются, и форма (Freeback.cshtml), короче, лучше не придумаешь. Первым делом создаем специальный метод контроллера (у меня он называется HomeController), который будет генерировать изображение:
public ActionResult Captcha() {
return new CaptchaResult();
}
Обратите внимание на возвращаемый результат. Далее в на форме Feedback.cshtml я добавил код, который будет отображать картинку (captcha) и поле ввода для его подтверждения:
<div class="editor-label">
@Html.ShowCaptcha("home", "captcha", 200, 50)
</div>
<div class="editor-field">
@Html.Editor("captcha")<br />
@Html.ValidationMessage("captcha")
</div>
В строке 2 указаны как параметры имя контроллера (controller) – “Home”, название действия (action) – “Captcha”, ширина – 200 (px) и высота 50 (px). В строке 5 и 6 – поле ввода подтверждения и, соответственно, место вывода сообщения об ошибке, если введен неверный код. Обратите внимание на параметры для 5 и 6 строки – “captcha”. Этот параметр - название поля ввода для Captcher, он поставляется по умолчанию. Но вы можете установить другой, но обязательно укажите его название в методе [post] у контролера. Мой метод такой:
[HttpPost]
[Captcher(MessageText = “Неверный код с картинки”)]
public ActionResult Feedback(FeedbackViewModel model) {
if (ModelState.IsValid) {
return View("FeedbackSent");
}
return View();
}
В строке 2 я поставил атрибут CaptcherAttribute, который и будет принимать от формы значение на проверку. Кстати, если задумаете менять название контрола для Captcher, то строке 2 в скобках в кавычках не забудьте его указать.
Вот так выглядит форма, а вернее captcha:

Существует и версия nuget-пакета для NET 4.5. Для того чтобы установить пакет воспользуйтесь командой:
PM> Install-Package MvcTools.Mvc4
Заключение
Как заключение хочу предложить ссылку на Nuget-Пакет MvcTools