任何人都可以解释如何在我的MVC3应用程序中使用像stackoverflow这样的reCaptcha功能。
你如何定制?
答案 0 :(得分:30)
我使用Google ReCaptcha,效果非常好,并且实施起来非常简单。
请注意,如果您使用的是Https,请确保您拥有当前版本的dll(此时为1.0.5.0)
您需要在Google Recaptcha网站上创建一个帐户,并获取一组公钥和私钥。将密钥添加到Web项目主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并安装.NET的reCAPTCHA插件
然后,转到VIEWS文件夹中的web.config文件。添加以下行:
<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
如果您更改了这些参数名称,那么当您的表单回发到控制器操作时,您将在运行时收到错误。
答案 1 :(得分:3)
我建议使用Honeypot Captcha。为您的用户提供的体验更好。这里有一个前MV MVC http://nuget.org/packages/SimpleHoneypot.MVC
PM> Install-Package SimpleHoneypot.MVC4
如何在这里获取WiKi:https://github.com/webadvanced/Honeypot-MVC/wiki
刚开始使用Getting Started
部分。
您可以在此处详细了解蜜罐验证码的一般概念:http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx