[转载]Using ReCaptcha with Asp.Net MVC – Derik Whittaker – Devlicio.us – Just the Tasty Bits.
For all the debate regarding if Captcha’s are a good thing or a bad thing one thing is certain (in my book). If you do not have some way to stop spam-bots your site will become overridden with junk in a hurry.
In an effort to reduce the amount of spam comments I am getting over at Dimecasts.net I finally got off my lazy ass and worked on implementing a Captcha. The solution I ended up going with was reCaptcha. I found that their setup was very easy to use and worked right out of the box. However, there was not a lot of information on the net on how to use reCaptcha within an MVC site, only ASP.NET Webforms. So I thought I would share my experiences and explain how I implemented reCaptcha on Dimecasts.
Step 1 – Signup for and download the reCaptcha dll from their site
Step 2 – Add reference to the Recaptcha.dll to your project
Step 3 – Create an Action Filter to handle the Captcha validation
- public class CaptchaValidatorAttribute : ActionFilterAttribute
- {
- private const string CHALLENGE_FIELD_KEY = “recaptcha_challenge_field”;
- private const string RESPONSE_FIELD_KEY = “recaptcha_response_field”;
- public override void OnActionExecuting(ActionExecutingContext filterContext)
- {
- var captchaChallengeValue = filterContext.HttpContext.Request.Form[CHALLENGE_FIELD_KEY];
- var captchaResponseValue = filterContext.HttpContext.Request.Form[RESPONSE_FIELD_KEY];
- var captchaValidtor = new Recaptcha.RecaptchaValidator
- {
- PrivateKey = — PUT PRIVATE KEY HERE –,
- RemoteIP = filterContext.HttpContext.Request.UserHostAddress,
- Challenge = captchaChallengeValue,
- Response = captchaResponseValue
- };
- var recaptchaResponse = captchaValidtor.Validate();
- // this will push the result value into a parameter in our Action
- filterContext.ActionParameters[“captchaValid”] = recaptchaResponse.IsValid;
- base.OnActionExecuting(filterContext);
- }
- }
Step 4 – Implement the Controller Action that will handle the form submission and Captcha validation
- [CaptchaValidator]
- [AcceptVerbs( HttpVerbs.Post )]
- public ActionResult CreateComment( Int32 id, bool captchaValid )
- {
- .. Do something here
- }
Step 5 – Create a Html Helper to build and render the Captcha control
- public static string GenerateCaptcha( this HtmlHelper helper )
- {
- var captchaControl = new Recaptcha.RecaptchaControl
- {
- ID = “recaptcha”,
- Theme = “blackglass”,
- PublicKey = — Put Public Key Here –,
- PrivateKey = — Put Private Key Here —
- };
- var htmlWriter = new HtmlTextWriter( new StringWriter() );
- captchaControl.RenderControl(htmlWriter);
- return htmlWriter.InnerWriter.ToString();
- }
Step 6 – Implement the logic in your view to actually render the Captcha control
- <:%= Html.GenerateCaptcha() %>:
Step 7 – Oh wait, there is no step 7. You are done.
There you go, that is all that is needed to setup reCaptcha for use in a MVC application
Till next time,