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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Installare le Web App site extension tramite una pipeline di Azure DevOps
Usare un KeyedService di default in ASP.NET Core 8
Eseguire operazioni con timeout in React
Evitare la script injection nelle GitHub Actions
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Elencare le container images installate in un cluster di Kubernetes
Recuperare un elemento inserito nella cache del browser tramite API JavaScript
Assegnare un valore di default a un parametro di una lambda in C#
Gestire liste di tipi semplici con Entity Framework Core