Bloccare un account utente con ASP.NET Identity 2

di Moreno Gentili, in ASP.NET Identity,

Tra le recenti novità di ASP.NET Identity 2, troviamo l'account lockout, un meccanismo di protezione atto a ridurre il rischio di accessi non autorizzati.

Sebbene questa sia una funzionalità automatica che causa il blocco dell'account dopo un certo numero di login falliti, possiamo sfruttarla anche on-demand, secondo le nostre necessità. Da amministratori dell'applicazione web, i motivi per cui potremmo voler bloccare un account sono molteplici:

  • L'utente ha terminato il suo periodo di prova oppure la sua sottoscrizione è scaduta;
  • A causa della condotta dell'utente, vogliamo imporre un periodo di fermo di durata limita o illimitata (ban);
  • L'utente non è più autorizzato ad accedere al suo account, come nel caso di un ex-impiegato.

Per bloccare l'account di un utente, ottieniamo la sua istanza di ApplicationUser dallo UserManager, la nostra principale API di gestione degli utenti. A questo punto, agiamo sulle due proprietà LockoutEnabled, che valorizzeremo a true per abilitare la funzione di blocco e LockoutEndDateUtc, a cui assegneremo una data di termine.

// Cerchiamo l'utente in base alla sua email, 
// ma potremmo cercarlo per id, nome o con una query LINQ
ApplicationUser utente = UserManager.FindByEmail("email@example.com");

// Abilitiamogli la funzione di blocco
utente.LockoutEnabled = true;

// Impostiamo una data di scadenza. DateTime.MaxValue 
// equivale a rendere il blocco permanente
utente.LockoutEndDateUtc = DateTime.MaxValue;
//Salviamo le modifiche
UserManager.Update(utente);

In alternativa, lo UserManager ci offre dei metodi per cambiare individualmente le due proprietà, purché l'ID dell'utente ci sia noto a priori.

UserManager.SetLockoutEnabled(idUtente, true);
UserManager.SetLockoutEndDate(idUtente, DateTimeOffset.MaxValue);

Quando il blocco è effettivo, l'utente vedrà apparire un messaggio al suo prossimo tentativo di login. Se abbiamo costruito la nostra applicazione usando il template per ASP.NET MVC di Visual Studio 2013, possiamo personalizzare tale messaggio dalla view /Views/Shared/Lockout.cshtml, includendo ad esempio le informazioni di contatto affinché l'utente sappia come richiedere assistenza.


In seguito, volendo sbloccare l'account, andiamo a rimuovere la data assegnata a LockoutEndDateUtc.

ApplicationUser utente = UserManager.FindByEmail("email@example.com");
// Resettiamo la data di scadenza impostandola a null
utente.LockoutEndDateUtc = null;
UserManager.Update(utente);

Oppure, conoscendo l'ID dell'utente:

// Usare DateTimeOffset.MinValue equivale ad impostare 
// la data di scadenza a null, come nell'esempio precedente
UserManager.SetLockoutEndDate(utente.Id, DateTimeOffset.MinValue);

Nota: in fase di sblocco non è consigliabile riportare la proprietà LockoutEnabled a false, per non rinunciare alla funzionalità automatica di account lockout.

Bloccare un account è un ottimo sistema per inibire l'accesso all'utente senza doverlo eliminare in maniera definitiva. Questo è desiderabile perché ci consente di mantenere l'integrità referenziale tra le varie tabelle della nostra base dati e preservare quindi i contenuti generati dall'utente stesso.

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