Habilitar a geração de código QR para aplicativos de autenticador TOTP no ASP.NET Core
O ASP.NET Core é fornecido com suporte para aplicativos autenticadores para autenticação individual. Aplicativos autenticadores de autenticação de dois fatores (2FA), usando um algoritmo de senha de uso único baseada em tempo (TOTP), são a abordagem recomendada pelo setor para 2FA. 2FA usando TOTP é preferencial para SMS 2FA. Um aplicativo autenticador fornece um código de 6 a 8 dígitos que os usuários devem inserir depois de confirmar seu nome de usuário e senha. Normalmente, um aplicativo autenticador é instalado em um smartphone.
Aviso
Um código TOTP do ASP.NET Core deve ser mantido em segredo porque pode ser usado para autenticar com sucesso várias vezes antes de expirar.
Os modelos de aplicativo Web ASP.NET Core dão suporte a autenticadores, mas não dão suporte à geração de código QR. Os geradores de código QR facilitam a configuração da 2FA. Este documento fornece diretrizes para aplicativos MVC e páginas do Razor sobre como adicionar a geração de código QR à página de configuração da 2FA. Para ver as diretrizes que se aplicam aos Blazor Web Apps, consulte Habilitar a geração de código QR para aplicativos autenticadores TOTP em um Blazor Web App do ASP.NET Core. Para obter diretrizes que se aplicam a aplicativos Blazor WebAssembly, consulte Habilitar a geração de código QR para aplicativos autenticadores TOTP no ASP.NET Core Blazor WebAssembly com ASP.NET Core Identity.
Os modelos de aplicativo Web ASP.NET Core dão suporte a autenticadores, mas não dão suporte à geração de código QR. Os geradores de código QR facilitam a configuração da 2FA. Este documento orienta você pela adição da geração de código QR à página de configuração da 2FA.
A autenticação de dois fatores não acontece usando um provedor de autenticação externa, como Google ou Facebook. Os logons externos são protegidos por qualquer mecanismo que o provedor de logon externo forneça. Considere, por exemplo, que o provedor de autenticação da Microsoft requer uma chave de hardware ou outra abordagem de 2FA. Se os modelos padrão exigissem 2FA para o aplicativo Web e o provedor de autenticação externa, os usuários seriam obrigados a atender a duas abordagens 2FA. Exigir duas abordagens de 2FA se desvia das práticas de segurança estabelecidas, que normalmente dependem de um único método 2FA forte para autenticação.
Adicionando códigos QR à página de configuração 2FA
Essas instruções usam qrcode.js
do repositório https://davidshimjs.github.io/qrcodejs/.
- Baixe a biblioteca
qrcode.js
JavaScript para a pastawwwroot\lib
em seu projeto. - Siga as instruções em Scaffold Identity para gerar
/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
. - No
/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
, localize a seçãoScripts
no final do arquivo:
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
}
- Crie um novo arquivo JavaScript chamado
qr.js
emwwwroot/js
e adicione o seguinte código para gerar o código QR:
window.addEventListener("load", () => {
const uri = document.getElementById("qrCodeData").getAttribute('data-url');
new QRCode(document.getElementById("qrCode"),
{
text: uri,
width: 150,
height: 150
});
});
- Atualize a seção
Scripts
para adicionar uma referência à bibliotecaqrcode.js
baixada anteriormente. - Adicione o arquivo
qr.js
com a chamada para gerar o código QR:
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
<script type="text/javascript" src="~/lib/qrcode.js"></script>
<script type="text/javascript" src="~/js/qr.js"></script>
}
- Exclua o parágrafo que vincula você a essas instruções.
Execute seu aplicativo e verifique se você pode verificar o código QR e validar o código que o autenticador comprova.
Alterar o nome do site no código QR
O nome do site no código QR é obtido do nome do projeto escolhido ao criar inicialmente seu projeto. Você pode alterá-lo procurando o método GenerateQrCodeUri(string email, string unformattedKey)
no /Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs
.
O código padrão do modelo tem a seguinte aparência:
private string GenerateQrCodeUri(string email, string unformattedKey)
{
return string.Format(
AuthenticatorUriFormat,
_urlEncoder.Encode("Razor Pages"),
_urlEncoder.Encode(email),
unformattedKey);
}
O segundo parâmetro na chamada para string.Format
é o nome do site, extraído do nome da solução. Ele pode ser alterado para qualquer valor, mas sempre deve ser codificado em URL.
Usando uma biblioteca de código QR diferente
Você pode substituir a biblioteca de código QR pela biblioteca preferida. O HTML contém um elemento qrCode
no qual você pode colocar um código QR por qualquer mecanismo que sua biblioteca forneça.
A URL formatada corretamente para o código QR está disponível em:
- Propriedade
AuthenticatorUri
do modelo. - Propriedade
data-url
no elementoqrCodeData
.
Distorção de tempo do cliente e do servidor TOTP
A autenticação com senha de uso único baseada em tempo (TOTP) depende do servidor e do dispositivo autenticador terem um tempo preciso. Os tokens duram apenas 30 segundos. Se os logons de 2FA TOTP estiverem falhando, verifique se a hora do servidor é precisa e, preferencialmente, se está sincronizada com um serviço NTP preciso.