Я использую Google ReCaptcha, и он работает очень хорошо и очень прост в реализации.
Обратите внимание, что если вы используете Https, убедитесь, что у вас есть текущая версия DLL (1.0.5.0 в настоящее время)
Вам необходимо создать учетную запись на сайте Google Recaptcha и получить набор открытых и закрытых ключей. Добавьте ключи в основной файл web.config вашего веб-проекта:
<appSettings>
<add key="webpages:Version" value="1.0.0.0"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
<add key="ReCaptchaPrivateKey" value="put your private key value here" />
<add key="ReCaptchaPublicKey" value="put your public key value here" />
</appSettings>
Теперь используйте NuGet и установите плагин reCAPTCHA для .NET
Затем перейдите к файлу web.config в папке VIEWS. Добавьте эту строку:
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="Recaptcha"/>
</namespaces>
Затем, по вашему мнению, вы хотите показать капчу, добавьте оператор using вверху вашего файла
@using Recaptcha;
затем добавьте это к вашему виду:
<div class="editor-label">
Are you a human?
</div>
<div class="editor-field">
@Html.Raw(Html.GenerateCaptcha("captcha", "clean"))
@Html.ValidationMessage("captcha")
</div>
В действии вашего контроллера вам нужно будет изменить подпись, чтобы принять результаты проверки:
[HttpPost]
[RecaptchaControlMvc.CaptchaValidator]
public ActionResult ForgotPassword(CheckUsernameViewModel model, bool captchaValid, string captchaErrorMessage) {
if (!Membership.EnablePasswordReset)
throw new Exception("Password reset is not allowed\r\n");
if(ModelState.IsValid) {
if(captchaValid) {
return RedirectToAction("AnswerSecurityQuestion", new { username = model.Username });
}
ModelState.AddModelError("", captchaErrorMessage);
}
return View(model);
}
Выполнение этих шагов позволило мне реализовать капчу на нескольких страницах, и она работает плавно. Обратите внимание, что имена параметров в действии контроллера ДОЛЖНЫ БЫТЬ ИМЕННО ПРАВИЛЬНО:
bool captchaValid, string captchaErrorMessage
Если вы изменили имена этих параметров, вы получите сообщение об ошибке во время выполнения, когда ваша форма вернется к действию контроллера.