Autenticación de dos factores (ejemplo en ASP.NET Core)
Los pasos a realizar son los siguientes:
Creación del proyecto
- Crear un nuevo proyecto, debe ser ASP.NET Core Web Application (.NET Core)
- Como template hay que seleccionar Web Application
- Debes cambiar las opciones de autenticación a Individal User Accounts
Habilitar SSL
- Agregar el paquete de NuGet: Microsoft.AspNetCore.Rewrite
- Agregar el siguiente código en el archivo Startup.cs, línea 44
// Enforce SSL
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
- Agregar el siguiente código en el archivo Startup.cs, línea 81
// Requires using Microsoft.AspNetCore.Rewrite;
var options = new RewriteOptions()
.AddRedirectToHttps();
- Habilitar SSL en las propiedades del sitio web, en la pestaña de debug.
Almacenar un código único para cada usuario
- Agregar el siguiente código en el archivo ApplicationUser.cs, línea 12
public virtual string TfaKey { get; set; }
- Agregar el siguiente código en el archivo 00000000000000_CreateIdentitySchema.cs, línea 60
TfaKey = table.Column<string>(maxLength: 32, nullable: true),
Preparar la aplicación para que soporte sesiones
- Agregar paquete de NuGet: Microsoft.AspNetCore.Session
- Agregar el siguiente código en el archivo Startup.cs, línea 60
// Add session support
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.CookieHttpOnly = true;
});
- Agregar el siguiente código en el archivo Startup.cs, línea 98
app.UseSession();
Agregar código de Google Authenticator
Código de Brandon Potter.
- Agregar nuevo proyecto (Google.Authenticator) del tipo Class Library (.NET Core)
- Añadir clases: SetupCode y TwoFactorAuthentication.
- Agregar referencia del nuevo proyecto al sitio web
Agregar el proveedor de tokens en el sitio web
Código de Dominique St-Amand.
- Agregar clase GoogleAuthenticatorProvider.
- Agregar el siguiente código en el archivo Startup.cs, línea 57
.AddTokenProvider(GoogleAuthenticatorProvider.ProviderName, typeof(GoogleAuthenticatorProvider))
Preparar la interfaz para el 2FA
- Agregar el siguiente código en el archivo IndexViewModel.cs, línea 17
public string TwoFactorAuthenticatorQrCode { get; set; }
- Agregar el siguiente código en el archivo ManageController.cs, líneas 64, 123 y 168
TwoFactorAuthenticatorQrCode = TempData["AuthenticatorQr"]?.ToString(),
// POST: /Manage/RequestTwoFactorAuthentication
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> RequestTwoFactorAuthentication()
{
var user = await GetCurrentUserAsync();
if (user != null)
{
var tfaKey = Guid.NewGuid().ToString("N");
user.TfaKey = tfaKey;
await _userManager.UpdateAsync(user);
var authenticator = new TwoFactorAuthenticator();
var code = authenticator.GenerateSetupCode(user.UserName, tfaKey, 300, 300);
TempData["AuthenticatorQr"] = code.QrCodeSetupImageUrl;
_logger.LogInformation(1, "User enabled two-factor authentication.");
}
return RedirectToAction(nameof(Index), "Manage");
}
user.TfaKey = null;
await _userManager.UpdateAsync(user);
- Reemplazar el código del
<dd></dd>
de la autenticación de dos factores por
@if (Model.TwoFactorAuthenticatorQrCode != null)
{
<img src="@Model.TwoFactorAuthenticatorQrCode" />
<form asp-controller="Manage" asp-action="EnableTwoFactorAuthentication" method="post" class="form-horizontal">
<button type="submit" class="btn-link btn-bracketed">Yes, I've scanned the code</button> Disabled
</form>
}
else
{
if (Model.TwoFactor)
{
<form asp-controller="Manage" asp-action="DisableTwoFactorAuthentication" method="post" class="form-horizontal">
Enabled <button type="submit" class="btn-link btn-bracketed">Disable</button>
</form>
}
else
{
<form asp-controller="Manage" asp-action="RequestTwoFactorAuthentication" method="post" class="form-horizontal">
<button type="submit" class="btn-link btn-bracketed">Enable</button> Disabled
</form>
}
}