Saltar al contenido

¿Cómo implementar reCaptcha para ASP.NET MVC?

Basta ya de investigar en otras páginas porque has llegado al sitio correcto, contamos con la respuesta que buscas pero sin complicarte.

Solución:

Hay algunos buenos ejemplos:

  • MVC reCaptcha – haciendo que reCaptcha sea más MVC’ish.
  • ReCaptcha Webhelper en ASP.NET MVC 3
  • ReCaptcha Control para ASP.NET MVC de Google Code.

Esto también se ha cubierto antes en esta pregunta de desbordamiento de pila.

NuGet Google reCAPTCHA V2 para MVC 4 y 5

  • Paquete NuGet
  • Demostración y documento

Agregué reCaptcha a un proyecto en el que estoy trabajando actualmente. Lo necesitaba para usar la API de AJAX ya que el elemento reCaptcha se cargó dinámicamente en la página. No pude encontrar ningún control existente y la API es simple, así que creé la mía.

Publicaré mi código aquí en caso de que alguien lo encuentre útil.

1: agregue la etiqueta de secuencia de comandos a los encabezados de la página maestra


2: Agrega tu keys a la web.config


    
    

3: Cree las extensiones Atributo de acción y Html Helper

namespace [Your chosen namespace].ReCaptcha

    public enum Theme  Red, White, BlackGlass, Clean 

    [Serializable]
    public class InvalidKeyException : ApplicationException
    
        public InvalidKeyException()  
        public InvalidKeyException(string message) : base(message)  
        public InvalidKeyException(string message, Exception inner) : base(message, inner)  
    

    public class ReCaptchaAttribute : ActionFilterAttribute
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        
            var userIP = filterContext.RequestContext.HttpContext.Request.UserHostAddress;

            var privateKey = ConfigurationManager.AppSettings.GetString("ReCaptcha.PrivateKey", "");

            if (string.IsNullOrWhiteSpace(privateKey))
                throw new InvalidKeyException("ReCaptcha.PrivateKey missing from appSettings");

            var postData = string.Format("&privatekey=0&remoteip=1&challenge=2&response=3",
                                         privateKey,
                                         userIP,
                                         filterContext.RequestContext.HttpContext.Request.Form["recaptcha_challenge_field"],
                                         filterContext.RequestContext.HttpContext.Request.Form["recaptcha_response_field"]);

            var postDataAsBytes = Encoding.UTF8.GetBytes(postData);

            // Create web request
            var request = WebRequest.Create("http://www.google.com/recaptcha/api/verify");
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = postDataAsBytes.Length;
            var dataStream = request.GetRequestStream();
            dataStream.Write(postDataAsBytes, 0, postDataAsBytes.Length);
            dataStream.Close();

            // Get the response.
            var response = request.GetResponse();

            using (dataStream = response.GetResponseStream())
            
                using (var reader = new StreamReader(dataStream))
                
                    var responseFromServer = reader.ReadToEnd();

                    if (!responseFromServer.StartsWith("true"))
                        ((Controller)filterContext.Controller).ModelState.AddModelError("ReCaptcha", "Captcha words typed incorrectly");
                
            
        
    

    public static class HtmlHelperExtensions
    
        public static MvcHtmlString GenerateCaptcha(this HtmlHelper helper, Theme theme, string callBack = null)
        
            const string htmlInjectString = @"
"; var publicKey = ConfigurationManager.AppSettings.GetString("ReCaptcha.PublicKey", ""); if (string.IsNullOrWhiteSpace(publicKey)) throw new InvalidKeyException("ReCaptcha.PublicKey missing from appSettings"); if (!string.IsNullOrWhiteSpace(callBack)) callBack = string.Concat(", callback: ", callBack); var html = string.Format(htmlInjectString, publicKey, theme.ToString().ToLower(), callBack); return MvcHtmlString.Create(html);

4: Agrega el captcha a tu vista

@using (Html.BeginForm("MyAction", "MyController"))

   @Html.TextBox("EmailAddress", Model.EmailAddress)
   @Html.GenerateCaptcha(Theme.White)
   

5: Agrega el attribute a tu acción

[HttpPost]
[ReCaptcha]
public ActionResult MyAction(MyModel model)

   if (!ModelState.IsValid) // Will have a Model Error "ReCaptcha" if the user input is incorrect
      return Json(new  capthcaInvalid = true );

   ... other stuff ...

6: Tenga en cuenta que deberá volver a cargar el captcha después de cada publicación, incluso si era válido y otra parte del formulario no era válida. Utilizar Recaptcha.reload();

Solución simple y completa trabajando para mi Admite ASP.NET MVC 4 y 5 (Admite ASP.NET 4.0, 4.5 y 4.5.1)

Paso 1: Instale el paquete NuGet por “Paquete de instalación reCAPTCH.MVC

Paso 2: Agrega tu Público y Privado key a su archivo web.config en la sección appsettings


    
    
  

Puedes crear una API key empareje para su sitio en https://www.google.com/recaptcha/intro/index.html y haga clic en Obtener reCAPTCHA en la parte superior de la página

Paso 3: Modifica tu formulario para incluir reCaptcha

@using reCAPTCHA.MVC
@using (Html.BeginForm())

    @Html.Recaptcha()
    @Html.ValidationMessage("ReCaptcha")
    

Etapa 4: implemente la acción del controlador que manejará el envío del formulario y la validación de Captcha

[CaptchaValidator(
PrivateKey = "your private reCaptcha Google Key",
ErrorMessage = "Invalid input captcha.",
RequiredMessage = "The captcha field is required.")]
public ActionResult MyAction(myVM model)

    if (ModelState.IsValid) //this will take care of captcha
    
    

O

public ActionResult MyAction(myVM model, bool captchaValid)

    if (captchaValid) //manually check for captchaValid 
    
    

Si piensas que te ha resultado de utilidad nuestro artículo, sería de mucha ayuda si lo compartes con más seniors de este modo contrubuyes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *