ASP .NET MVC 5 - Confirmação de conta via email e Recuperação de senha - II


 Neste tutorial veremos como criar uma aplicação ASP .NET MVC 5 com confirmação de email e recuperação de senha usando o sistema de membership ASP .NET Identity.
 

Chegou o curso Curso ASP .NET .MVC 5 Vídeo Aulas onde você vai aprender a criar aplicações web dinâmicas usando a ASP .NET MVC 5.

Na primeira parte do artigo implementamos a confirmação do email do usuário e agora vamos alterar esse comportamento e vamos obrigar o usuário a confirmar o email antes de se logar e implementar a recuperação de senha.

 

Recursos usados :

Confirmando a conta via email antes de fazer o login

Abra o projeto Mvc_ConfRec criado na primeira parte do artigo usando o VS 2013 Express for web;

Vamos começar alterando novamente o código da Action Register do arquivo AccountController na pasta Controllers.

Comente a linha que realiza o login durante o registro : await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

Inclua as linhas :

ViewBag.Message = "Verifique o seu email e confirme a sua conta, você tem que confirmar a sua conta antes de fazer o login ";
return View("Info");

E comente a linha que redireciona o usuário para a Action Index : return RedirectToAction("Index", "Home");

Abaixo vemos o código completo com as alterações:

[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);

           //For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
           //Send an email with this link
           string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
           var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
           await ServicoEmail.EnviaEmailAsync(model.Email, "Confirme a sua conta", "Confirme a sua conta clicando <a href=\"" + callbackUrl + "\">AQUI</a>");
           ViewBag.Message = "Verifique o seu email e confirme a sua conta, você tem que confirmar a sua conta antes de fazer o login ";
           return View("Info");
          //return RedirectToAction("Index", "Home");
       }
       AddErrors(result);
   }
   //If we got this far, something failed, redisplay form
   return View(model);
}      

Agora temos que criar a view Info.cshtml na pasta /Views/Shared.

Clique com o botão direito do mouse na pasta Shared e a seguir em Add -> View;

Informe o nome Info e marque para usar uma página de layout e clique no botão Add;

A seguir inclua o código abaixo no arquivo Info.cshtml:

@{
    ViewBag.Title = "Info";
}

<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>

<hr />
Macoratti.net

Agora vamos alterar a Action Login do arquivo AccountController.

Inclua as linhas destacadas em azul conforme mostra o código abaixo:

 [HttpPost]
 [AllowAnonymous]
 [ValidateAntiForgeryToken]
  public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
  {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
            // Requeira que o usuário tenha confirmado o email antes de logar
             var user = await UserManager.FindByNameAsync(model.Email);
             if (user != null)
             {
                if (!await UserManager.IsEmailConfirmedAsync(user.Id))
                {
                    ViewBag.errorMessage = "Você tem que confirmar o email antes de fazer o login.";
                    return View("Error");
                }
            }
            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, change to shouldLockout: true
            var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
            switch (result)
            {
                case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);
                case SignInStatus.LockedOut:
                    return View("Lockout");
                case SignInStatus.RequiresVerification:
                    return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
                case SignInStatus.Failure:
                default:
                    ModelState.AddModelError("", "Invalid login attempt.");
                    return View(model);
            }
  }

Vamos também alterar o código da view Error.cshtml da pasta Shared.

Abra o arquivo Error.cshtml e altere o seu código conforme a seguir:

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = "Error";
}
<h1 class="text-danger">Error.</h1>
@{
    if (String.IsNullOrEmpty(ViewBag.errorMessage))
    {
        <h2 class="text-danger">Ocorreu um erro durante o processamento da sua requisição</h2>
    }
    else
    {
        <h2 class="text-danger">@ViewBag.errorMessage</h2>
    }
}

Agora é só alegria...

Já podemos testar nossa implementação...

Antes de testar inclua o atributo [Authorize] na Action Contact do controlador Home.

Assim podemos verificar que usuários anônimos não terão acesso a página e usuários autenticados terão.

  [Authorize]
   public ActionResult Contact()
   {
        ViewBag.Message = "Bem-Vindo, o seu acesso esta liberado...";
        return View();
  }

Agora vamos rodar a nossa aplicação e verificar o seu comportamento registrando um novo usuário:

Ao clicar no botão Registrar o usuário não será mais enviado para página principal do site (Home/Index).

Ele será direcionado para a view Info que exibe a mensagem de que ele tem que confirmar o email antes de logar.

Vamos verificar se o email foi enviado para o usuário macoratti@ig.com.br consultando a caixa de mensagens:

Vemos que o usuário recebeu o email para confirmar a conta. Vamos abrir o email...

Vamos clicar no link solicitado para ver o que acontece...

Voilá...

O usuário é redirecionado para o site e recebe a mensagem agradecendo por confirmar o email e um link para fazer o login.

Se o usuário clicar no menu Contato ele não terá acesso e será redirecionado para a página de login provando que usuários anônimos não têm acesso ao site.

Na terceira parte do artigo vamos implementar a recuperação da senha.

Pegue o projeto completo aqui :  Mvc_ConfRec2.zip (sem as referências)

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti