Web Login seguro en ASP.NET MVC 5 (Parte 2 Final)

En este tutorial mostramos cómo crear una aplicación web ASP.NET MVC 5 con registro / inicio de sesión, confirmación de correo electrónico utilizando SMTP Client y Recuperación de contraseña. Al final del tutorial se encuentra el enlace de descarga del código fuente.

Importante: Si no has visto la parte 1 de este tutorial la puedes ver aqui
En la parte 2 explicamos recuperación de contraseña y reenvío de confirmación por correo electrónico.


Recuperación / restablecimiento de contraseña

1. Elimine los caracteres de comentario del método HttpPost ForgotPassword en el controlador de Account:

// POST: /Account/ForgotPassword
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task ForgotPassword(ForgotPasswordViewModel model)
{
  if (ModelState.IsValid)
  {
    var user = await UserManager.FindByNameAsync(model.Email);
    if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
    {
      // Don't reveal that the user does not exist or is not confirmed
      return View("ForgotPasswordConfirmation");
    }

    string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
    var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
    await UserManager.SendEmailAsync(user.Id, "Restrablecer Contraseña", "Por favor restrablezca su contraseña dando click <a href=\"" + callbackUrl + "\">aquí</a>");
    return RedirectToAction("ForgotPasswordConfirmation", "Account");
  }

  // If we got this far, something failed, redisplay form
  return View(model);
}

2. Elimine los caracteres de comentario del ActionLink ForgotPassword en el archivo la vista Views \ Account \ Login.cshtml:

<p>
    @Html.ActionLink("Olvidó su contraseña?", "ForgotPassword")
</p>

La página de inicio de sesión ahora mostrará un enlace para restablecer la contraseña.


Presione click en "Olvidó su contraseña?"


Presione click en "Email Link" 


Recibirá un correo con un link para restablecer su contraseña, presione clic en el enlace.


Restablezca su contraseña escribiendo su correo, y su nueva contraseña.

Al presionar clic en Reset, se muestra una confirmación de que ya puede iniciar sesión usando su nueva contraseña.


Reenviar el enlace de confirmación de correo electrónico

Una vez que un usuario crea una nueva cuenta, se le envía por correo electrónico un enlace de confirmación que debe usar antes de poder iniciar sesión. Si el usuario borra accidentalmente el correo electrónico de confirmación, o el correo electrónico nunca llega, necesitará que se envíe nuevamente el enlace de confirmación. Los siguientes cambios de código muestran cómo habilitar esto.

1. Agregue el siguiente método auxiliar a la parte inferior del archivo Controllers\ AccountController.cs:

private async Task SendEmailConfirmationTokenAsync(string userID, string subject)
{
    string code = await UserManager.GenerateEmailConfirmationTokenAsync(userID);
    var callbackUrl = Url.Action("ConfirmEmail", "Account",
       new { userId = userID, code = code }, protocol: Request.Url.Scheme);
    await UserManager.SendEmailAsync(userID, subject,
       "Por favor confirme su cuenta dando clic <a href=\"" + callbackUrl + "\">aquí</a>");

    return callbackUrl;
}


2. Actualice el método Register para usar el nuevo método auxiliar:

// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<actionresult> Register(RegisterViewModel model)
{
   if (ModelState.IsValid)
   {
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
      var result = await UserManager.CreateAsync(user, model.Password);
      if (result.Succeeded)
      {
         //await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

         string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Confirme su cuenta");

         ViewBag.Message = "Revise su correo y confirme la cuenta, debe ser cofirmada "
                           + "antes de iniciar sesión.";

         return View("Info");
         //return RedirectToAction("Index", "Home");
      }
      AddErrors(result);
   }

   // If we got this far, something failed, redisplay form
   return View(model);
}

3. Actualice el método de inicio de sesión para volver a enviar la contraseña si la cuenta de usuario no se ha confirmado:

// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
  ...

  // Requerir que el usuario confirme el correo antes de iniciar sesión.
  //var user = await UserManager.FindByNameAsync(model.Email);
  var user = UserManager.FindByEmail(model.Email); if (user != null) { UserManager.Find(user.UserName, model.Password); }
  if (user != null)
  {
      if (!await UserManager.IsEmailConfirmedAsync(user.Id))
      {
          string callbackUrl = await SendEmailConfirmationTokenAsync(user.Id, "Reenvío de confirmación de cuenta");

          ViewBag.errorMessage = "Debe confirmar el correo antes de iniciar sesión.";
          return View("Error");
      }
  }

  ...
}


Para probar, cambie el registro en la tabla AspNetUsers el campo EmailConfirmed a False y ejecute la aplicación.


Trate de iniciar sesión, se mostrará un error indicando que no ha confirmado su correo.


Revise la bandeja de entrada de su correo electrónico, encontrará un correo de confirmación de cuenta, presione clic en el enlace.



Trate de iniciar sesión nuevamente, esta vez si podrá hacerlo.


Código fuente de la parte 2 de este tutorial (Completo):

Siguientes pasos

Integrar registro e inicio de sesión usando OAuth2 Sign-on para cuentas de Facebook, Twitter, LinkedIn y Google. Esto lo veremos en un próximo tutorial.

Comentarios

Publicar un comentario