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


  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.

O ASP.NET Identity pode ser visto como uma atualização sobre o que o sistema membership deve ser quando você está construindo aplicações modernas para a web, telefone ou tablet.

Nesse contexto o ASP.NET Identity foi concebido para substituir os sistemas ASP .NET Membership e Simple Membership. Ele inclui suporte a perfil, integração OAuth, trabalha com Owin, e está incluído com os modelos ASP.NET no Visual Studio 2013.

Dentre as características do ASP .NET Identity podemos destacar:
 

- Customização do perfil do usuário simplificado (escrito em Code First(EF))

- Controle de persistência de dados (Entity Framework, NHibernate, MySQL, MongoDB, etc)

- Totalmente testável (Testes unitários)

- Role Provider (separação de acessos por perfil)

- Claims Based (baseado em declarações)

- Autenticação com redes sociais (FaceBook, Twitter,etc.)

- Integração com Active Directory

- Integração com OWIN (Open Web Interface for .NET)

- Entregue via NuGet

- Open Source - Acompanhe no GitHub - https://github.com/aspnet/Identity

O ASP.NET Identity funciona com ASP.NET MVC, WebAPI, WebPages, WebForms e SignalR, enfim, com todos os projetos ASP .NET. (No VS 2013 ele é usado nos modelos de projeto para ASP .NET MVC, Web Forms, Web API e SPA)

Obs: A versão atual do ASP .NET Identity é a 2.2.0 (março/2015).

Recursos usados :

Abra o VS 2013 Express for web e clique em New Project;

A seguir selecione Visual C# -> ASP .NET Web Application;

Informe o nome Mvc_ConfRec e clique no botão OK;

A seguir selecione o template MVC, marque MVC, defina o tipo de autenticação para Individual User Accounts e clique no botão OK;

Será criado um projeto contendo toda a estrutura de pastas criadas pelo framework ASP .NET MVC com autenticação e segurança padrão definidas.

Se desejar hospedar a aplicação no Azure marque o item - Host in the Cloud. (Veja o meu artigo: ASP .NET - Criando uma aplicação web e fazendo o deploy em um serviço Azure )

Se executarmos a aplicação iremos perceber que ela vai funcionar sem precisar alterar nenhuma linha de código.

Eu vou alterar alguns textos nos arquivos /Views/Shared/_Layout.cshtml e /Views/Shared/_LoginPartial.html; vou alterar os textos do atributo Display do Data Annotations das classes RegisterViewModel e LoginViewModel no arquivo AccountViewModels na pasta Models, para exibir uma tela de apresentação menos poluída e traduzida para o português; conforme podemos ver abaixo após executar o projeto:

Ao clicar no link - Logar - veremos a tela de login apresentada conforme a figura abaixo:

Clicando no menu Registrar veremos a seguinte página:

Até este momento a única validação que temos são:

1- As definições para lógica de validação de senha definidas na classe ApplicationUserManager do arquivo IdentityConfig.cs da pasta App_Start;

2- O atributo Data Annotations [EmailAddress] definido na classe RegisterViewModel do arquivo AccountViewModel na pasta Models;

Vamos registrar um novo usuário.

Ao fazer isso o Entity Framework Code-First entra em ação criando o banco de dados e gerando as tabelas no SQL Server LocalDB, conforme podemos ver na janela Server Explorer:

Clique com o botão direito do mouse sobre a tabela AspNetUsers e a seguir clique Show Table Data;

Veremos os dados do usuário que acabamos de registrar na tabela e veremos que alguns campos possuem valores definidos como a confirmação via email que esta marcada como False, a autenticação em duas etapas também esta como False.

Muito bem...

Vamos alterar essa implementação padrão feita pela ASP .NET MVC 5.

Vamos começar deletando esse registro da tabela pois vamos cadastrar esse usuário novamente com confirmação de email.

Implementando a Confirmação via Email

Embora seja uma proteção limitada, é uma boa prática confirmar o email de um novo usuário quando o mesmo se registra de forma a evitar que o mesmo use um email de outro usuário, ou que ao informar o seu email incorretamente o usuário não possa ser notificado.

Ativando a confirmação do registro via email somente vai permitir que o usuário acesse o seu site completamente após confirmar os dados recebidos em seu email pessoal.

No exemplo deste tutorial vamos implementar a notificação via email usando os recursos do SendGrid.(Você pode usar o seu servidor SMTP ou outro mecanismo.)

Vamos instalar o SendGrid via Nuget mas antes você vai precisar obter uma conta e uma senha no SendGrid.

Para criar um usuário e uma senha que serão necessários para podermos enviar email acesse o link: https://sendgrid.com/   e clique no botão Try for Free.

A seguir faça o registro preenchendo o formulário mostrado abaixo:

Ao final você deverá ter um usuário e senha cadastrados no SendGrid.

Agora vamos instalar o SendGrid usando o Nuget.

Clique no menu TOOLS e a seguir em Nuget Package Manager -> Manage Nuget Package for Solution :

Informe na caixa de busca o nome send grid e após o mesmo ser localizado clique no botão Install:

A seguir vamos criar uma nova pasta em nosso projeto chamada Servicos.

No menu PROJECT clique em New Folder e informe o nome Servicos.

Clique com o botão direito sobre a pasta Servicos e a seguir em Add->Class;

Informe o nome ServicoEmail.cs para a classe;

Em seguida digite o código abaixo nesta classe que cria um método estático chamado EnviaEmailAsync() que envia o email para usuário:

using SendGrid;
using System.Net;
using System.Threading.Tasks;
namespace Mvc_ConfRec.Servicos
{
    public class ServicoEmail 
    {
        public static Task EnviaEmailAsync(string email, string assunto, string mensagem)
        {
            // serviço para enviar email
            var minhaMensagem = new SendGridMessage();
            minhaMensagem.AddTo(email);
            minhaMensagem.From = new System.Net.Mail.MailAddress("macoratti@yahoo.com", "Macoratti. net");
            minhaMensagem.Subject = assunto;
            minhaMensagem.Text = mensagem;
            minhaMensagem.Html = mensagem;
            var credenciais = new NetworkCredential("_seu_usuario_sendgrid_", "_sua_senha_sendgrid_");
            // Cria um transporte web para enviar email
            var transporteWeb = new Web(credenciais);
            // Envia o email
            if (transporteWeb != null)
            {
                return transporteWeb.DeliverAsync(minhaMensagem);
            }
            else
            {
                return Task.FromResult(0);
            }
        }
    }
}

Após isso temos que fazer alguns ajustes no código que já esta criado no projeto ASP .NET por padrão.

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

Descomente as linhas de código em destaque em azul, e, na última linha, altere o código para chamar o método EnviaEmailAsync da classe ServicoEmail, que criamos na pasta Servicos, passando o email do usuário (model.Email), o assunto e a mensagem:

        [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>");
                    return RedirectToAction("Index", "Home");
                }
                AddErrors(result);
            }
            // If we got this far, something failed, redisplay form
            return View(model);
   }

Vamos alterar também a view ConfirmEmail.cshtml da pasta /Views/Account alterando o código conforme a seguir:

@{
    ViewBag.Title = "Confirmar Email";
}
<h2>@ViewBag.Title.</h2>
<div>
    <p>
        Obrigado por confirmar o seu email. Por gentileza, @Html.ActionLink("Clique aqui para fazer o log in", "Login", "Account", 
routeValues: null, htmlAttributes: new { id = "loginLink" })
    </p>
</div>

Agora é só alegria...

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

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

Ao clicar no botão Registrar seremos enviados para a página principal do site (Home/Index).

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.

Concluímos então que nossa singela implementação funciona.

Tudo bem, mas do jeito que esta o usuário ainda faz o login e depois é que vai confirmar o email.

Na segunda parte do artigo vamos alterar esse comportamento e vamos obrigar o usuário a confirmar o email antes de se logar.

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

Jesus lhes respondeu, e disse: A minha doutrina não é minha, mas daquele que me enviou.
Se alguém quiser fazer a vontade dele, pela mesma doutrina conhecerá se ela é de Deus, ou se eu falo de mim mesmo.

João 7:16,17

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