Solución:
Use NuGet e instale Recaptcha para .NET (también es compatible con MVC)
http://nuget.org/packages/RecaptchaNet/
La documentación está en el sitio:
http://recaptchanet.codeplex.com/
Hay otros captchas:
http://captchamvc.codeplex.com/
EDITAR:
Este proyecto se ha trasladado a GitHub https://github.com/tanveery/recaptcha-net
NuGet Google reCAPTCHA V2 para MVC 4 y 5
- Paquete NuGet
- Demo y documento
Web.config En la sección appSettings de su archivo web.config, agregue las claves de la siguiente manera:
<appSettings>
<add name="reCaptchaPublicKey" value="Your site key" />
<add name="reCaptchaPrivateKey" value="Your secret key" />
</appSettings>
Agregue Recaptcha en su vista.
@using reCAPTCHA.MVC
@using (Html.BeginForm())
{
@Html.Recaptcha()
@Html.ValidationMessage("ReCaptcha")
<input type="submit" value="Register" />
}
Verificando la respuesta del usuario.
[HttpPost]
[CaptchaValidator]
public ActionResult Index(RegisterModel registerModel, bool captchaValid)
{
if (ModelState.IsValid)
{
}
return View(registerModel);
}
EDITAR:
También debe agregar esto en la etiqueta de su cabeza o es posible que vea un captcha incorrecto
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
En primer lugar, parece que está mezclando ASP.NET estándar y ASP.NET MVC. Si desea hacer MVC, la forma estándar de hacerlo es la Html.TextBoxFor()
tipo de cosas, y luego maneja el valor de eso en un método de acción del controlador en lugar de escribir algo en línea en la página. Entonces tienes algo como esto:
Page.aspx
<rhcap:Captcha ID="Captcha1" runat="server"></rhcap:Captcha>
<%= Html.TextBoxFor(m => m.UserCaptcha) %>
y luego en:
SomeController.cs
[HttpGet]
public ActionResult Page()
{
// generate captcha code here
ControllerContext.HttpContext.Session["Captcha"] = captchaValue;
return View(new PageViewModel());
}
[HttpPost]
public ActionResult Page(PageViewModel model)
{
if (model.UserCaptcha == ControllerContext.HttpContext.Session["Captcha"])
{
// do valid captcha stuff
}
}
Llevar esto al siguiente nivel sería implementarlo en una FilterAttribute
. Pero esto debería funcionar para la mayoría de los usos.