Usare la two-factor authentication con ASP.NET Identity

di Moreno Gentili, in ASP.NET Identity,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi