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
Utilizzare un service principal per accedere a Azure Container Registry
Installare le Web App site extension tramite una pipeline di Azure DevOps
Usare le collection expression per inizializzare una lista di oggetti in C#
Generare la software bill of material (SBOM) in GitHub
Creare una custom property in GitHub
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Migliorare l'organizzazione delle risorse con Azure Policy
Triggerare una pipeline su un altro repository di Azure DevOps
Come migrare da una form non tipizzata a una form tipizzata in Angular
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core