L'approccio utilizzato da ASP.NET Identity 2 per la configurazione delle regole di security è molto differente rispetto a quanto accadeva con Forms Authentication. Le impostazioni, infatti, non sono più contenute all'interno del file web.config, ma viene sfruttato il costruttore statico ApplicationUserManager.Create nel file IdentityConfig.cs.
Come già accennato nel nostro recente articolo sull'argomento, per default ASP.NET Identity utilizza un PasswordValidator che possiamo configurare intervenendo direttamente sul codice C#:
manager.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = true, RequireDigit = true, RequireLowercase = true, RequireUppercase = true, };
Questo approccio ci permette una notevole flessibilità, perché con pochissimo sforzo possiamo implementare regole personalizzate. Immaginiamo, per esempio, di voler impedire l'uso di password troppo banali. Ci basterà creare una classe che implementi IIdentityValidator
public class DictionaryPasswordValidator : PasswordValidator { public HashSet<string> ForbiddenWords { get; set; } public override async Task<IdentityResult> ValidateAsync(string item) { var result = await base.ValidateAsync(item); if (this.ForbiddenWords != null && this.ForbiddenWords.Any(x => x == item)) { var errors = result.Errors.ToList(); errors.Add("La password utilizzata è troppo semplice"); return new IdentityResult(errors); } return result; } }
Il metodo in alto esegue innanzitutto l'implementazione della classe base. Successivamente, verifica anche se la password sia contenuta nell'elenco delle ForbiddenWords che abbiamo specificato in fase di configurazione, restituendo un errore ulteriore in caso affermativo.
A questo punto non ci resta che utilizzarlo nella creazione dell'ApplicationUserManager:
manager.PasswordValidator = new DictionaryPasswordValidator { RequiredLength = 6, ForbiddenWords = new HashSet<string> { "password", "testtest", .... } };
Uno dei limiti di PasswordValidator è che consente di implementare solo validazioni formali sulla password: non ci vengono infatti passate informazioni di contesto (come per esempio il nome utente) e pertanto non è possibile effettuare verifiche più specifiche, per esempio che la password non contenga lo username o che sia differente dalle ultime utilizzate.
In un prossimo script scopriremo come superare anche questo limite.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
.NET Conference Italia 2023
Utilizzare Tailwind CSS all'interno di React: installazione
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI
Disabilitare automaticamente un workflow di GitHub
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Come migrare da una form non tipizzata a una form tipizzata in Angular
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Ottimizzazione dei block template in Angular 17
Configurare policy CORS in Azure Container Apps
Utilizzare i primary constructor in C#
Disabilitare automaticamente un workflow di GitHub (parte 2)
I più letti di oggi
- C# 4
- Spaziatura tra i caratteri in Silverlight 5
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Segui in tempo reale il TechEd 2004
- da oggi è possibile fare login velocemente con LinkedIn e Google. a questi si aggiunge il supporto già attivo per Facebook, Twitter, Microsoft Account, Windows Hello e OpenID, per darvi sempre più possibilità di accedere semplicemente alla nostra community! #aspitalia
- Migrare una service connection a workload identity federation in Azure DevOps
- Evitare postback multipli in un UpdatePanel