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
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Gestire domini wildcard in Azure Container Apps
Eseguire una GroupBy per entity in Entity Framework
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Eseguire operazioni sui blob con Azure Storage Actions
Evitare la script injection nelle GitHub Actions
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Copiare automaticamente le secret tra più repository di GitHub
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Utilizzare politiche di resiliency con Azure Container App