Habilitación de la generación de códigos QR para las aplicaciones de autenticación TOTP en ASP.NET Core
ASP.NET Core incluye compatibilidad con aplicaciones autenticadoras para la autenticación individual. Las aplicaciones autenticadoras de autenticación en dos fases (2FA), que usan un algoritmo de contraseña única basado en tiempo (TOTP), son el enfoque recomendado por el sector para 2FA. La 2FA con TOTP se prefiere a SMS 2FA. Una aplicación autenticadora proporciona un código de 6 a 8 dígitos que los usuarios deben escribir después de confirmar su nombre de usuario y contraseña. Normalmente, una aplicación autenticadora está instalada en un smartphone.
Advertencia
Se debe mantener un código TOTP de ASP.NET Core secreto porque se puede usar para autenticarse correctamente varias veces antes de que expire.
Las plantillas de aplicación web de ASP.NET Core admiten autenticadores, pero no proporcionan compatibilidad con la generación de código QR. Los generadores de código QR facilitan la configuración de 2FA. En este documento se proporcionan instrucciones para Razor Pages y aplicaciones MVC sobre cómo agregar la generación de código QR a la página de configuración de 2FA. Para obtener una guía que se aplique a Blazor Web App, consulta Habilitación de la generación de código QR para aplicaciones de autenticador TOTP en un ASP.NET Core Blazor Web App.
Las plantillas de aplicación web de ASP.NET Core admiten autenticadores, pero no proporcionan compatibilidad con la generación de código QR. Los generadores de código QR facilitan la configuración de 2FA. Este documento le guiará a través de la adición de la generación de código QR a la página de configuración de 2FA.
La autenticación en dos fases no se produce mediante un proveedor de autenticación externo, como Google o Facebook. Los inicios de sesión externos están protegidos por cualquier mecanismo que proporcione el proveedor de inicio de sesión externo. Consideremos, por ejemplo, que el proveedor de autenticación de Microsoft requiere una clave de hardware u otro enfoque de 2FA. Si las plantillas predeterminadas aplicaron 2FA "local", los usuarios tendrían que satisfacer dos enfoques de 2FA, que no es un escenario que se usa habitualmente.
Agregar códigos QR a la página de configuración de 2FA
Estas instrucciones usan qrcode.js
desde el repositorio https://davidshimjs.github.io/qrcodejs/.
- Descargue la biblioteca
qrcode.js
JavaScript en la carpetawwwroot\lib
del proyecto. - Siga las instrucciones de Scaffolding Identity para generar
/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
. - En
/Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml
, busque la secciónScripts
al final del archivo:
@section Scripts {
@await Html.PartialAsync("_ValidationScriptsPartial")
}
- Cree un nuevo archivo JavaScript llamado
qr.js
enwwwroot/js
y agregue el código siguiente para generar el 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
});
});
- Actualice la sección
Scripts
para agregar una referencia a la bibliotecaqrcode.js
descargada anteriormente. - Agregue el archivo
qr.js
con la llamada para generar el 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>
}
- Elimine el párrafo que le vincula a estas instrucciones.
Ejecute la aplicación y asegúrese de que puede escanear el código QR y validar el código que le proporciona el autenticador.
Cambiar el nombre del sitio en el código QR
El nombre del sitio en el código QR se toma del nombre del proyecto que elija al crear inicialmente el proyecto. Para cambiarlo, busque el método GenerateQrCodeUri(string email, string unformattedKey)
en /Areas/Identity/Pages/Account/Manage/EnableAuthenticator.cshtml.cs
.
El código predeterminado de la plantilla tiene el siguiente aspecto:
private string GenerateQrCodeUri(string email, string unformattedKey)
{
return string.Format(
AuthenticatorUriFormat,
_urlEncoder.Encode("Razor Pages"),
_urlEncoder.Encode(email),
unformattedKey);
}
El segundo parámetro de la llamada a string.Format
es el nombre del sitio, tomado del nombre de la solución. Se puede cambiar a cualquier valor, pero siempre debe estar codificado como dirección URL.
Uso de una biblioteca de código QR diferente
Puede reemplazar la biblioteca de código QR por su biblioteca preferida. El HTML contiene un elemento qrCode
en el que puede colocar un código QR mediante cualquier mecanismo que proporcione la biblioteca.
La dirección URL con formato correcto para el código QR está disponible en:
- Propiedad
AuthenticatorUri
del modelo. - Propiedad
data-url
en el elementoqrCodeData
.
Distorsión de tiempo del cliente y del servidor TOTP
La autenticación con contraseña de un solo uso basada en tiempo (TOTP) depende de que tanto el servidor como el dispositivo autenticador tengan una hora exacta. Los tokens solo duran 30 segundos. Si se produce un error en el inicio de sesión TOTP 2FA, compruebe que la hora del servidor es correcta y, preferiblemente, que está sincronizada con un servicio NTP preciso.