Primeiras aulas do curso ASP.NET Identity parte 4: autenticação mais segura com 2 fatores

ASP.NET Identity parte 4: autenticação mais segura com 2 fatores

O que são fatores de autenticação - Introdução

Bem vindo a parte 4 do nosso curso de ASP.NET Identity, meu nome é Guilherme Matheus e se você fez a parte 1, a parte 2 e a parte 3, fundamentais para nós continuarmos com a parte 4, já lhe dou os parabéns.

Na parte 4, vamos aprender sobre autenticação de dois fatores, vamos aprender o que são fatores de autenticação, como elas funcionam e como elas trazem mais segurança para o nosso usuário.

Na parte 4, vamos ver também como dar mais segurança para o usuário que esquece sua conta logada em uma máquina que não é sua, vamos ajudar o usuário a se proteger contra aqueles usuários que vão na máquina ver que a aplicação está logada e vai fazer coisa errada.

Vamos passar por bastante conceitos sobre autenticação de dois fatores, vamos aprender mais sobre o Owin e sobre a integração do Owin com o ASP.NET Identity e vamos ver bastante coisa nessa jornada. Aguardo você e vamos lá.

O que são fatores de autenticação - Fatores de autenticacao

Agora estamos usando autenticação externa no nosso fórum e o usuário que se registra por autenticação externa, tem um trabalho muito mais fácil, ele não precisa preencher o formulário e basta que ele autorize o nosso fórum a obter suas informações e usar o autenticador externo para autenticar ele na nossa aplicação.

E nós, como desenvolvedores, também tivemos menos trabalho porque temos menos trabalho para lidar com a segurança das informações e no fluxo que vamos manter esse usuário na nossa base, confirmação de e-mail, como guardar a senha, não é? Na verdade, nem tanto, porque nós ainda estamos dando a opção para o usuário se cadastrar da forma tradicional.

E se estamos dando essa forma para o usuário se cadastrar da forma tradicional, precisamos nos preocupar com a segurança dele da mesma forma, será que a senha é sempre a forma mais segura de autenticar um usuário? A senha do usuário é algo que ele sabe.

E se alguém descobrir a senha desse usuário? Isso não é raro de acontecer, você pode deduzir a senha de um usuário, você pode observar enquanto ele digita no teclado a sua senha, então ela é segura, mas até um certo limite.

A senha é um fator de autenticação, como assim um fator de autenticação? Um fator de autenticação porque é algo que eu sei, eu sei a minha senha. Existem três fatores de autenticação e muito possivelmente você lida com eles diariamente.

Por exemplo, se você trabalha em um prédio e tem uma catraca, você mostra um crachá para você conseguir passar por essa catraca, isso daqui é um fator de autenticação, não é algo que você sabe, não é uma senha que você digita, uma senha que você sabe, isso daqui é outro fator, é algo que você tem, diariamente, quando vamos no banco, existem muitos bancos que exigem mais que apenas a senha para você usar o caixa eletrônico, por exemplo.

Eu conheço bancos que eles exigem que você coloque a sua senha, algo que você sabe e exigem também que você coloque a sua digital, eu conheço outros também que eles pedem que escaneie a palma da sua mão, porque o formato das veias na palma da sua mão, ele possui diferenças entre as pessoas, assim como a digital, então é um fator de autenticação também.

Mas qual é a diferença entre o crachá e a palma da minha mão, as minhas digitais? As minhas digitais, a minha palma, a íris de meus olhos, são algo que eu sou, eu sou isso, é outro fator de autenticação, então vemos três fatores de autenticação, algo que eu sou, ou seja, meu próprio corpo, algo que eu tenho, um objeto físico, como crachá e algo que eu sei, que é a minha senha.

Por enquanto, o nosso fórum possui apenas a senha, é apenas um fator de autenticação, podemos tornar isso mais seguro habilitando a autenticação de dois fatores, então vamos usar a senha desse usuário e além da senha, vamos usar algo que o usuário tem.

Mas como é que vamos pedir para o usuário, por exemplo, passar um crachá no computador para ele entrar no nosso fórum? Não precisa ser um crachá, podemos usar algo mais comum, como por exemplo, um aparelho celular, podemos mandar um código para o celular do nosso usuário e quando ele resolver fazer um login no nosso fórum, ele digita o código que vamos enviar para ele, além da sua senha, tendo então, uma autenticação de dois fatores.

Para fazer isso, vamos precisar saber qual é o número de celular do nosso usuário, para nós termos o número de celular do nosso usuário, podemos criar uma página que ele digite suas informações, então eu vou parar de executar a aplicação e dentro da ContaController, vamos criar uma action onde o usuário vai poder editar as suas informações da sua conta.

Então vamos lá, “public ActionResult MinhaConta”, essa daqui é a action de get, eu vou aproveitar, copiar e colar e eu vou fazer o postback, já vou tornar o postback assíncrono porque vamos usar o UserManager aqui, vamos ter uma viewmodel também para o usuário digitar suas informações e colocar seu número de celular e habilitar ou não, a autenticação de dois fatores.

Então, seguindo a convenção, “Conta” a controller, “MinhaConta” a action e o sufixo “ViewModel”, “modelo”. Vamos criar essa classe aqui, então eu vou vir no diretório ViewModels, eu vou adicionar uma nova classe, aqui não vamos apenas adicionar o número de telefone desse usuário, vamos tornar possível que ele altere o seu nome também.

Então vamos lá, propriedade “string NomeCompleto”, agora sim, uma propriedade “string NumeroDeCelular”, eu estou explicitando que é celular porque não pode ser um número de telefone, um telefone fixo não serve para nós, precisamos do número de celular e o usuário, ele vai então, habilitar ou não, a autenticação de dois fatores.

Então “bool HabilitarAutenticacaoDeDoisFatores”, vamos adornar esses atributos, o nome, ele é obrigatório, “Required”, vamos colocar aqui o “Display” para mostrar isso mais bonito, “Name = “Nome completo””.

O número de celular, ele não é obrigatório, não é obrigatório que nosso usuário dê o número de celular, mas vamos usar o display para mostrar “Número de celular”, a mesma coisa para o HabilitarAutenticacaoDeDoisFatores, então eu vou colocar aqui “Habilitar autenticação de dois fatores”.

Agora que temos nossa viewmodel criada, vamos usar aqui, a MinhaConta, vamos preencher então, esse modelo, antes de renderizar a página, então “var modelo = new ContaMinhaContaViewModel”.

Aqui vamos então, precisar preencher o nome completo do usuário, seu número de celular, se ele já havia preenchido e esse flag, esse booleano, se ele habilitou ou não a autenticação de dois fatores, vamos precisar recuperar o nosso usuário aqui nessa action, para nós obtermos o id do nosso usuário, podemos usar o HttpContext.

Então vamos lá, “var usuarioId = HttpContext”, isso faz parte da classe controller, “.User.Identity”, o Identity, é uma propriedade do DOT NET e quando usamos o ASP.NET Identity em uma aplicação ASP.NET MVC, o ASP.NET Identity que preenche isso para nós e dentro do Identity, temos um método, “GetUserId”.

Agora que temos o id do usuário do DOT NET, vamos usar o ASP.NET Identity para recuperar o nosso objeto UsuarioAplicacao, então “var usuario = UserManager.FindByIdAsync(usuarioId)”, esse método é assíncrono, então “await” e aqui “async Task”.

Agora que temos o nosso usuário, vamos preencher o nosso modelo, “modelo.NomeCompleto = usuario.NomeCompleto”, “modelo.NumeroDeCelular = usuario.PhoneNumber”.

PhoneNumber faz parte do IdentityUser e como o UsuarioAplicacao, ele deriva de IdentityUser, nós temos isso aqui para nós, “modelo.HabilitarAutenticacaoDeDoisFatores = usuario.TwoFactorEnabled”, isso também faz parte do Identity, só que nós estamos usando no nosso modelo aqui, agora vamos retornar a “View” com esse “modelo”.

Vamos refletir um pouco sobre HabilitarAutenticacaoDeDoisFatores e o NumeroDeCelular, se o usuário, ele digita um número de celular, mas ele acaba errando um dígito e ele marca a opção para habilitar autenticação de dois fatores, sempre que o usuário tentar entrar no nosso fórum, vamos mandar uma SMS com o código para o segundo fator, mas vamos mandar para o telefone errado, então o usuário não vai mais conseguir entrar na sua conta no nosso fórum.

Então, nós só devemos habilitar autenticação de dois fatores, quando confirmamos que, de fato, o usuário tem aquele número de celular em sua posse, então da mesma forma que nós confirmamos o endereço de e-mail, nós vamos confirmar o número de celular desse usuário para manter a segurança e termos certeza que o nosso usuário vai conseguir entrar no nosso portal.

Então, eu vou adicionar uma nova propriedade aqui, “public bool”, que é “NumeroDeCelularConfirmado” e essa opção para ele habilitar a autenticação de dois fatores, só vai estar disponível quando o número de celular for confirmado.

Então eu vou voltar aqui na ContaController e “modelo.NumeroDeCelularConfirmado = usuario.PhoneNumberConfirmed” e esse também é um atributo que já existe no IdentityUser, agora retornamos a nossa view. Vamos criar essa view e continuar essa página para o usuário habilitar a autenticação de dois fatores.

O que são fatores de autenticação - Pagina de edição de conta

Então antes de criar a nossa view de fato, eu só vou dar um “return View” aqui no postback porque a gente ainda não vai implementar ele, a gente já vai escrever o seu código.

E vamos lá, eu vou navegar para a nossa pasta Views Conta e eu vou adicionar uma nova view, “MinhaConta”, vou dar um adicionar, arquivo criado, só vamos mudar o título aqui para deixar mais amigável, eu vou mudar o modelo que é “ByteBank.Forum.ViewModels.ContaMinhaContaViewModel”.

E agora a gente vai criar então, o formulário para o usuário editar as suas informações, então “Html.BeginForm” e vamos colocar aqui o ValidationSummary, “Html.ValidationSummary” e aqui, vamos fazer como fizemos em todas as outras páginas, o “Html.EditorForModel”.

Mas o EditorForModel, ele vai pedir para o ASP.NET analisar o modelo e ele vai renderizar de acordo com o que temos no nosso modelo, o NomeCompleto, NumeroDeCelular, o flag HabilitarAutenticacaoDeDoisFatores e esse flag NumeroDeCelularConfirmado, que na verdade, não faz sentido, o usuário não deve preencher isso.

E o HabilitarAutenticacaoDeDoisFatores, só deve estar disponível para o usuário que confirmou o seu número de celular, então a gente tem uma lógica aqui, como a gente tem essa lógica, a gente não pode usar o EditorForModel porque o EditorForModel, ele não conhece a nossa lógica.

Então eu vou renderizar campo por campo, então vamos começar pelo NomeCompleto, “Html.LabelFor(modelo => modelo.NomeCompleto)”, vamos quebrar essa linha, “”, “Html.EditorFor(modelo => modelo.NomeCompleto)”, vamos quebrar a linha aqui no final também, eu vou copiar e colar para o nosso NumeroDeCelular.

E aqui a gente pode colocar nossa lógica para exibir, ou não, o campo de habilitar autenticação de dois fatores, então “if(Model.NumeroDeCelularConfirmado)”, nós vamos renderizar esse trecho aqui para o flag de “HabilitarAutenticacaoDeDoisFatores”.

Senão, vamos mostrar uma mensagem para encorajar o usuário a digitar seu número de celular e confirmar e ele habilitar essa opção, então vou criar um parágrafo, “* Informe e confirme seu número de celular para habilitar a autenticação com 2 fatores!”, criamos tudo isso aqui, vamos voltar para a ContaController, MinhaConta está renderizando o modelo.

E está faltando o botãozinho de salvar, então vamos criar o botãozinho de salvar, para criar o botãozinho de salvar, eu vou simplesmente entrar aqui na EsqueciSenha, pode ser qualquer um e eu só vou copiar esse botãozinho, copiei, vou voltar aqui na MinhaConta no final e eu vou colar, é um input type submit e o valor “Salvar”, só vamos colocar a classe “btn btn-default” para deixar mais bonito essa página.

E agora que colocamos o botão de salvar, precisamos dar uma maneira que o usuário possa acessar essa página. Então a gente pode alterar, por exemplo, a forma que a gente renderiza, no canto superior direito, o nome do usuário, por enquanto renderizamos assim, temos um parágrafo com o texto Olá e o nome do usuário.

E se a gente transformar esse nome do usuário em um link que aponta para a action MinhaConta? Vamos fazer assim? Então eu vou quebrar linha, vamos indentar, eu vou quebrar aqui também, vou quebrar aqui e quebrar aqui também.

Esse User.Identity.GetUserName não vai ficar mais aqui, porque aqui a gente vai usar o “Html.ActionLink”, com o texto desse link sendo o nome do usuário, o username e apontando para a action “MinhaConta” da “Conta” controller.

Agora sim, vamos executar a aplicação? Eu vou dar um start e antes de clicar em Login, vamos perceber que a conta que a gente está usando para testar, ela foi criada com o autenticador externo, com o autenticador externo, a gente não vai usar o número de celular para autenticação de dois fatores porque isso será responsabilidade do autenticador externo.

Então pra gente trocar o tipo da conta, eu vou voltar aqui na tabela de usuários, View Data, eu vou apagar o nosso usuário e a gente vai criar de novo, só que sem autenticação externa, apenas como um usuário normal, então eu vou clicar em Registrar, username “guilherme”, nome completo “Guilherme Matheus Costa”, e-mail “guilherme.costa.bytebank” e uma senha “teste123!”. Não vamos usar a autenticação externa, eu vou clicar em Registrar.

Enquanto ele está criando esse usuário, eu já vou abrir o gmail para confirmar esse e-mail, então eu vou navegar aqui, recebemos esse e-mail aqui, vou clicar nele e confirmamos o nosso e-mail, eu posso clicar em Login usando o meu e-mail e a minha senha, agora vou clicar em Fazer Login.

Agora notem que o Olá Guilherme virou um link, eu vou clicar nesse link e temos aqui o nome completo e o número de celular, eu vou preencher o número de celular, mas a gente vai precisar confirmar ele, então quando a gente for salvar, a gente vai verificar se o número de celular foi preenchido e ele não foi confirmado, a gente vai então, mandar uma SMS de confirmação e fazer um fluxo muito semelhante com o fluxo que fizemos com a confirmação de e-mail.

Sobre o curso ASP.NET Identity parte 4: autenticação mais segura com 2 fatores

O curso ASP.NET Identity parte 4: autenticação mais segura com 2 fatores possui 105 minutos de vídeos, em um total de 37 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas