Generatore di Password casuali in C# per ASP.NET Core & ASP.NET MVC Identity Una pratica classe helper in C# che può essere utilizzata per generare una password casuale con lettere maiuscole e minuscole, numeri e caratteri speciali

C# Random Password Generator for ASP.NET Core & ASP.NET MVC Identity Framework

Ieri mi sono trovato con la necessità di creare un certo numero di password casuali in C#. Prima di implementare un metodo apposito ho speso alcuni minuti cercando in giro per il web, nella speranza di trovare qualcosa di pronto da poter utilizzare. Mi sono quindi imbattuto in questo interessantissimo post del 2006 di Mads Kristensen, l'autore di numerose estensioni per Visual Studio come Web Essentials, Web Compiler, ASP.NET Core Web Templates e molte altre.

Sfortunatamente, l'esempio di codice contenuto in quell'articolo non mi ha aiutato granché, poiché non forniva alcuna garanzia che la password generata fosse dotata dei requisiti di sicurezza a me necessari: nello specifico, avevo bisogno di generare password che, oltre ad avere una lunghezza minima, contenessero almeno una lettera maiuscola, una lettera minuscola, un numero e un carattere speciale (non alfanumerico). Le password casuali generate dal metodo di Mads possono avere o meno questi requisiti, a seconda dei caratteri che vengono determinati a caso. Una limitazione non compatibile con il metodo  UserManager.CreateUserAsync(username, password)  del namespace  Microsoft.AspNetCore.Identity , che - per impostazione predefinita - è configurato per accettare unicamente password dotate dei suddetti requisiti.

Oltre all'articolo di Mads ho trovato anche questo interessante thread su StackOverflow, dove la communty elencava una serie di possibili opzioni, tra cui:

  • Utilizzare il metodo  Membership.GeneratePassword incluso nell'assembly   System.Web.Security, sfortunatamente non (ancora) disponibile in ASP.NET Core.
  • Realizzare un porting ASP.NET Core del metodo sopracitato, a partire dal codice sorgente ufficiale (rilasciato su MIT license).
  • Implementare un metodo personalizzato.

Alla fine mi sono deciso a seguire la terza ipotesi, proprio come scelse di fare Mads Kristensen oltre 11 anni orsono.

Il risultato dei miei sforzi è la classe che trovate qui sotto:

Come è possibile vedere, il metodo da me realizzato accetta come parametro un oggetto di tipo PasswordOptions, definito nell'assembly Microsoft.AspNetCore.Identity: se non avete questo assembly a disposizione potete tranquillamente rimpiazzarlo con una serie di parametri (due int, quattro bool) o da una una classe POCO analoga.

Se utilizzate ASP.NET Core, è probabile che abbiate già un oggetto PasswordOptions da poter utilizzare nel metodo ConfigureService contenuto nella classe Startup del vostro progetto:

Potete quindi memorizzare questo oggetto da qualche parte (ad es. in una variabile statica dell'applicazione) e riutilizzarlo ogniqualvolta vi serva di chiamare il metodo GenerateRandomPassword di cui sopra.

Considerazioni di sicurezza

L'algoritmo di randomizzazione utilizzato per generare la password utilizza una classe denominata CryptoRandom, adattata dall'omonima classe CryptoRandom utilizzata all'interno della libreria IdentityModel, replica i metodi della nota (ma ahimé decisamente insicura) classe Random presente all'interno del .NET Framework, sostituendo l'implementazione standard con un approccio basato su un generatore crittografico: potete scaricarla da questo link.

All'interno del progetto GitHub troverete anche un'implementazione alternativa di questa stessa classe (CryptoRandom2), sempre basata sul medesimo approccio, che ho recuperato da questo Gist (gli autori sono Stephen Toub, Shawn Farkas e Markus Olsson). Se volete utilizzare questo metodo alternativo non dovrete fare altro che rinominare la classe da CryptoRandom2CryptoRandom, sostituendo così l'implementazione precedente - o, più semplicemente, modificare il codice del PasswordGenerator instanziando un oggetto di tipo CryptoRandom2.

Conclusioni

Per il momento è tutto:  aggiungo solo che, avete bisogno di un metodo C# che controlli la "forza" (o per meglio dire il livello di sicurezza) di una o più password, potete dare un'occhiata anche a quest'altro articolo.

UPDATE: Da qualche settimana la versione aggiornata di questa libreria è disponibile su GitHub su licenza Apache License 2.0.

 

 

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


The reCAPTCHA verification period has expired. Please reload the page.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.