Uno dei motivi per adottare ASP.NET Identity nelle nostre applicazioni web consiste nella semplicità con cui possiamo avvalerci di funzionalità avanzate per la protezione degli account dei nostri utenti.
La two-factor authentication è una di queste funzionalità e permette di rendere più sicura la procedura di login aggiungendo una ulteriore fase dopo l'immissione di username e password. Durante questa fase, all'utente viene chiesto di digitare un codice di sicurezza recapitato via e-mail o SMS.

L'idea è che, anche in caso di furto di password, un malintenzionato non possa riuscire a completare la procedura di login perché non in possesso del telefono cellulare o delle credenziali di accesso alla casella e-mail del legittimo proprietario dell'account. Prevedere questo ulteriore livello di sicurezza è particolarmente importante quando trattiamo dati sensibili, come le informazioni mediche o finanziarie dell'utente.
Per noi sviluppatori, iniziare ad usare la two-factor authentication è molto semplice. Percorriamo ora i passi richiesti, tenendo presente che sono già stati svolti se ci affidiamo al template per applicazioni ASP.NET di Visual Studio 2013.
Cominciamo dal file /App_Start/Startup.Auth.cs e dal metodo ConfigureAuth, da cui abiliteremo il supporto con la seguente riga di codice. Contestualmente, impostiamo il tempo utile che viene concesso all'utente per inserire il codice di sicurezza.
// Qui l'utente ha 5 minuti di tempo per ricevere // e digitare il codice di sicurezza app.UseTwoFactorSignInCookie( DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));
Dal file /App_Start/IdentityConfig.cs, andiamo a registrare i servizi che si occuperanno di generare e recapitare materialmente il codice all'utente.
manager.RegisterTwoFactorProvider( "Codice telefono", new PhoneNumberTokenProvider<ApplicationUser> { MessageFormat = "Il codice di sicurezza è {0}" }); manager.RegisterTwoFactorProvider( "Codice e-mail", new EmailTokenProvider<ApplicationUser> { Subject = "Codice di sicurezza", BodyFormat = "Il codice di sicurezza è {0}" }); manager.EmailService = new EmailService(); manager.SmsService = new SmsService();
Registrando un EmailService ed un SmsService, concediamo all'utente di scegliere tra due modalità di recapito. I due servizi sono un'implementazione di IIdentityMessageService, un'interfaccia che richiede la presenza di un solo metodo SendAsync, da cui effettueremo il recapito del codice.
public class EmailService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // Qui logica di recapito del codice via e-mail return Task.FromResult(0); } }
Abilitare la two-factor authentication non significa necessariamente costringere l'utente ad affrontare la fase di immissione del codice. Avvalersi (o meno) di tale funzionalità è una scelta che l'utente può esprimere dalla pagina di gestione del suo account.

Alla pressione del comando "Abilita", invocheremo l'apposito metodo SetTwoFactorEnabledAsync dello UserManager per memorizzare la preferenza dell'utente.
// Otteniamo l'id dell'utente corrente... string userId = User.Identity.GetUserId(); // ...e usiamolo per abilitare la two-factor authentication // per il suo account await UserManager.SetTwoFactorEnabledAsync(userId, true);
Se i requisiti di sicurezza fossero particolarmente stringenti, possiamo ovviamente imporre l'uso obbligatorio della two-factor authentication. In tal caso, è opportuno che la funzionalità sia abilitata già dalla creazione dell'account.
// Creiamo un'istanza di ApplicationUser // e impostiamo TwoFactorEnabled a true // I valori di userName, email e password sono // ottenuti dal form inviato dall'utente var user = new ApplicationUser { UserName = userName, Email = email, TwoFactorEnabled = true }; //Creiamo l'utente nello storage var result = await UserManager.CreateAsync(user, password);
Anche in questa situazione, l'utente può comunque evitare di inserire il codice di sicurezza se indica che il browser corrente è di suo uso esclusivo e perciò relativamente al riparo da un possibile furto di dati.

two-factor-browser.png[/img]
Selezionando l'apposita spunta, ASP.NET Identity emetterà un cookie che costituirà un titolo valido per evitare il reinserimento del codice ad ogni successivo login.
Per supportare questa opzione, aprimo di nuovo il file /App_Start/Startup.Auth.cs e nel corpo del metodo ConfigureAuth aggiungiamo:
app.UseTwoFactorRememberBrowserCookie( DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
In questo modo possiamo agevolmente coniugare le necessità di quegli utenti che vogliono mantenere una certa scioltezza nel login, con quelle di coloro che invece vogliono avvalersi di una modalità di accesso più sicura. ASP.NET Identity si rivela abbastanza versatile nell'accomodare le diverse esigenze, comprese quelle dello sviluppatore che vuole supportare al meglio i suoi utenti senza dover investire troppo tempo in dettagli.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Loggare le query più lente con Entity Framework
Generare velocemente pagine CRUD in Blazor con QuickGrid
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Configurare lo startup di applicazioni server e client con .NET Aspire
Ordine e importanza per @layer in CSS
Eseguire query in contemporanea con EF
Triggerare una pipeline su un altro repository di Azure DevOps
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Utilizzare WhenEach per processare i risultati di una lista di task
Introduzione ai web component HTML
I più letti di oggi
- Beta 1 di VS 2005 Enterprise Architect
- Point-in-time restore con gli Azure Storage Blob
- Focus dei tag input con HTML5
- Il nuovo tag nav in HTML5
- Evitare la modalità di risparmio energetico in una Windows Store app
- Real Code Day 4.0: costruire applicazioni reali - Firenze
- AI&ML Conference 2019 - Milano
- Mono 0.12: verso una nuova implementazione di ASP.NET