Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Por Rick Anderson e Swiss-Devs
Warning
Aplicativos autenticadores de autenticação de dois fatores (2FA), usando um TOTP (Algoritmo de Senha Única) baseado em tempo, são a abordagem recomendada pelo setor para 2FA. 2FA usando TOTP é preferida em relação a 2FA por SMS. Para obter mais informações, consulte Habilitar a geração de código QR para aplicativos autenticadores TOTP no ASP.NET Core para ASP.NET Core 2.0 ou posterior.
Este tutorial mostra como configurar a autenticação de dois fatores (2FA) usando SMS. Instruções são fornecidas para twilio e ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/), mas você pode usar qualquer outro provedor de SMS. Recomendamos que você conclua a Confirmação da Conta e a Recuperação de Senha antes de iniciar este tutorial.
Exibir ou baixar o código de exemplo. Como baixar.
Criar um novo projeto do ASP.NET Core
Crie um novo aplicativo Web ASP.NET Core nomeado Web2FA com contas individuais. Siga as instruções em Impor HTTPS no ASP.NET Core para configurar e exigir HTTPS.
Criar uma conta sms
Crie uma conta SMS, por exemplo, do twilio ou do ASPSMS (https://www.aspsms.com/asp.net/identity/core/testcredits/). Registre as credenciais de autenticação (para twilio: accountSid e authToken, para ASPSMS: Userkey e Password).
Descobrir credenciais do provedor de SMS
Twilio:
Na guia Painel da sua conta do Twilio, copie o SID da conta e o token de autenticação.
ASPSMS:
Nas configurações da sua conta, navegue até Userkey e copie-a junto com sua Senha.
Posteriormente, armazenaremos esses valores com a ferramenta secret-manager dentro das chaves SMSAccountIdentification e SMSAccountPassword.
Especificando SenderID/Originador
Twilio: Na guia Números, copie seu número de telefone do Twilio.
ASPSMS: No Menu Desbloquear Originadores, desbloqueie um ou mais Originadores ou escolha um Originador alfanumérico (sem suporte de todas as redes).
Posteriormente, armazenaremos esse valor com a ferramenta secret-manager dentro da chave SMSAccountFrom.
Fornecer credenciais para o serviço de SMS
Usaremos o padrão Opções para acessar a conta de usuário e as configurações de chave.
- Crie uma classe para buscar a chave SMS segura. Para este exemplo, a
SMSoptionsclasse é criada noServices/SMSoptions.csarquivo.
namespace Web2FA.Services
{
public class SMSoptions
{
public string SMSAccountIdentification { get; set; }
public string SMSAccountPassword { get; set; }
public string SMSAccountFrom { get; set; }
}
}
Defina os SMSAccountIdentification, SMSAccountPassword e SMSAccountFrom com a ferramenta secret-manager. Por exemplo:
C:/Web2FA/src/WebApp1>dotnet user-secrets set SMSAccountIdentification 12345
info: Successfully saved SMSAccountIdentification = 12345 to the secret store.
- Adicione o pacote NuGet para o provedor de SMS. No Console do Gerenciador de Pacotes (PMC), execute:
Twilio:
Install-Package Twilio
ASPSMS:
Install-Package ASPSMS
- Adicione código no arquivo para habilitar o
Services/MessageServices.csSMS. Use o Twilio ou a seção ASPSMS:
Twilio:
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;
namespace Web2FA.Services
{
// This class is used by the application to send Email and SMS
// when you turn on two-factor authentication in ASP.NET Identity.
// For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
public class AuthMessageSender : IEmailSender, ISmsSender
{
public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
{
Options = optionsAccessor.Value;
}
public SMSoptions Options { get; } // set only via Secret Manager
public Task SendEmailAsync(string email, string subject, string message)
{
// Plug in your email service here to send an email.
return Task.FromResult(0);
}
public Task SendSmsAsync(string number, string message)
{
// Plug in your SMS service here to send a text message.
// Your Account SID from twilio.com/console
var accountSid = Options.SMSAccountIdentification;
// Your Auth Token from twilio.com/console
var authToken = Options.SMSAccountPassword;
TwilioClient.Init(accountSid, authToken);
return MessageResource.CreateAsync(
to: new PhoneNumber(number),
from: new PhoneNumber(Options.SMSAccountFrom),
body: message);
}
}
}
ASPSMS:
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
namespace Web2FA.Services
{
// This class is used by the application to send Email and SMS
// when you turn on two-factor authentication in ASP.NET Identity.
// For more details see this link https://go.microsoft.com/fwlink/?LinkID=532713
public class AuthMessageSender : IEmailSender, ISmsSender
{
public AuthMessageSender(IOptions<SMSoptions> optionsAccessor)
{
Options = optionsAccessor.Value;
}
public SMSoptions Options { get; } // set only via Secret Manager
public Task SendEmailAsync(string email, string subject, string message)
{
// Plug in your email service here to send an email.
return Task.FromResult(0);
}
public Task SendSmsAsync(string number, string message)
{
ASPSMS.SMS SMSSender = new ASPSMS.SMS();
SMSSender.Userkey = Options.SMSAccountIdentification;
SMSSender.Password = Options.SMSAccountPassword;
SMSSender.Originator = Options.SMSAccountFrom;
SMSSender.AddRecipient(number);
SMSSender.MessageData = message;
SMSSender.SendTextSMS();
return Task.FromResult(0);
}
}
}
Configurar a inicialização para usar SMSoptions
Adicione SMSoptions ao contêiner de serviço no método ConfigureServices em Startup.cs:
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
services.Configure<SMSoptions>(Configuration);
}
Habilitar a autenticação de dois fatores
Abra o Views/Manage/Index.cshtmlRazor arquivo de exibição e remova os caracteres de comentário (para que nenhuma marcação seja comentada).
Fazer logon com autenticação de dois fatores
- Executar o aplicativo e registrar um novo usuário
- Toque no seu nome de usuário, o que ativa o método de ação
Indexno controlador de gerenciamento. Em seguida, toque no link Adicionar número de telefone.
- Adicione um número de telefone que receberá o código de verificação e toque em Enviar código de verificação.
- Você receberá uma mensagem de texto com o código de verificação. Insira-o e toque em Enviar
Se você não receber uma mensagem de texto, consulte a página de log do twilio.
- A exibição Gerenciar mostra que seu número de telefone foi adicionado com êxito.
- Toque em Habilitar para habilitar a autenticação de dois fatores.
Testar autenticação de dois fatores
Desconectar-se.
Iniciar sessão.
A conta de usuário habilitou a autenticação de dois fatores, portanto, você precisa fornecer o segundo fator de autenticação. Neste tutorial, você habilitou a verificação telefônica. Os modelos internos também permitem que você configure o email como o segundo fator. Você pode configurar outros segundos fatores para autenticação, como códigos QR. Toque em Enviar.
Insira o código que você obtém na mensagem SMS.
Clicar na caixa de seleção Lembrar deste navegador isentará você de precisar usar a 2FA para fazer logon ao usar o mesmo dispositivo e navegador. Habilitar a 2FA e clicar em Lembrar deste navegador fornecerá proteção 2FA forte contra usuários mal-intencionados que tentam acessar sua conta, desde que não tenham acesso ao seu dispositivo. Você pode fazer isso em qualquer dispositivo privado que utilize regularmente. Ao configurar Lembrar este navegador, você obtém a segurança adicional da 2FA de dispositivos que não usa regularmente e obtém a conveniência de não precisar passar pela 2FA em seus próprios dispositivos.
Bloqueio de conta para proteção contra ataques de força bruta
É recomendado usar o bloqueio de conta junto com a autenticação de dois fatores (2FA). Depois que um usuário entra por meio de uma conta local ou conta social, cada tentativa com falha na 2FA é armazenada. Se o máximo de tentativas de acesso com falha for atingido, o usuário será bloqueado (padrão: bloqueio de 5 minutos após cinco tentativas de acesso com falha). Uma autenticação bem-sucedida redefine a contagem de tentativas de acesso com falha e redefine o relógio. As tentativas de acesso com falha máxima e o tempo de bloqueio podem ser definidos com MaxFailedAccessAttempts e DefaultLockoutTimeSpan. O seguinte configura o bloqueio de conta por 10 minutos após 10 tentativas de acesso com falha:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
services.Configure<IdentityOptions>(options =>
{
options.Lockout.MaxFailedAccessAttempts = 10;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(10);
});
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
services.Configure<SMSoptions>(Configuration);
}
Confirme que PasswordSignInAsync define lockoutOnFailure como true:
var result = await _signInManager.PasswordSignInAsync(
Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: true);