Skip to main content

PasswordCheck – Classe C# per calcolare il livello di sicurezza delle password

Diversi anni fa ho sviluppato questa classe per calcolare il livello di sicurezza delle password inserite dagli utenti in varie circostanze, come ad esempio durante la registrazione di un nuovo account all’interno di una applicazione web. Poiché a distanza di tempo continuo a utilizzarla con regolarità ho deciso oggi di condividerla all’interno di questo post, sperando che possa essere utile anche a qualcun altro.

La classe può essere utilizzata in due modi:

  • Attraverso il metodo generico GetPasswordStrength, che calcola il livello di sicurezza (strength) di una qualsiasi password attraverso una serie di controlli basati sui classici fattori: lunghezza minima, presenza di lettere maiuscole/minuscole, numeri e/o caratteri speciali.
  • Attraverso il metodo IsStrongPassword, che risponde a un criterio più specifico e personalizzato.

Il primo metodo di utilizzo è particolarmente indicato in tutti i casi in cui non sono previste delle policy di controllo specifiche, mentre il secondo si rende necessario ogniqualvolta abbiamo dei controlli obbligatori da effettuare. Personalmente io finisco spesso per utilizzare entrambi: il primo per mostrare all’utente la forza della propria password, il secondo – o una sua implementazione leggermente diversa utilizzando gli helper methods inclusi – per controllare i requisiti minimi previsti e/o richiesti dal committente.

Tutti i metodi utilizzati sono spiegati all’interno della classe, quindi non c’è molto altro da dire: se la classe vi è di qualche aiuto, sentitevi liberi di lasciare un feedback nella sezione “commenti” in basso!

(altro…)

 

Come creare file e archivi ZIP per il download con ASP.NET MVC e C#

Durante lo sviluppo di una applicazione web con ASP.NET MVC e/o ASP.NET Core può capitare di avere l’esigenza di dover creare un archivio ZIP all’interno di un Controller, ad esempio per consentire ai propri utenti di effettuare il download di più file all’interno di una singola request.

Fino a non molto tempo fa il modo migliore per implementare questa feature era ricorrere a librerie esterne, come le note SharpZipLib, DotNetZip e via dicendo… a meno di non voler ricorrere al namespace System.IO.Compression, a patto però di rinunciare a molte delle comodità garantite dalle soluzioni sopracitate.

A partire dal .NET Framework 4.5 è stata finalmente introdotta anche una soluzione nativa che, almeno nelle sue funzionalità di base, non ha nulla da invidiare alle librerie di terze parti più diffuse: si tratta della classe ZipArchive, new-entry del namespace System.IO.Compression, che consente di creare archivi in modo estremamente semplice e veloce.

Di seguito un veloce esempio che utilizza un MemoryStream e un paio di byte array contenenti i dati di altrettanti file da comprimere:

(altro…)

 

Istanziare un Dictionary con chiavi Case-Insensitive in ASP.NET C#

Tra le varie classi messe a disposizione da ASP.NET, il Dictionary resta una  di quelle più utilizzate: la sua enorme versatilità compensa ampiamente la relativa inefficienza che si presenta in alcune situazioni, dove l’utilizzo di un Hashtable o di una classe più snella consentirebbe di ottenere prestazioni migliori.

Nella maggior parte dei casi, quando utilizziamo un Dictionary impostando una stringa come chiave (key), la modalità predefinita di confronto tra stringhe prevista dalla classe, che risponde a un criterio case-sensitive – considerando quindi rilevante la differenza tra lettere maiuscole e minuscole all’interno della chiave – può fare al caso nostro:

E così via. Il Dictionary di cui sopra avrà quindi tre diverse entries, ciascuna accessibile mediante la propria chiave case-sensitive specifica.

Vi sono casi, però, in cui questo comportamento predefinito non ci è di grande aiuto: fortunatamente, il costruttore della classe prevede un overload specifico che possiamo utilizzare in tutti i casi in cui vogliamo che il confronto tra le chiavi-stringa risponda a un criterio diverso. Qualora volessimo un confronto case-insensitive, ad esempio, potremmo istanziare la classe nel seguente modo:

(altro…)

 

ASP.NET e IIS – Errore (413) Request Entity Too Large e Maximum Request Length Exceeded – Come risolvere

Se vi siete imbattuti in questo articolo è probabile che stiate cercando di configurare la vostra applicazione ASP.NET (Core, MVC, Web API, Windows Forms, WCF o altro) su un web server IIS il quale, a differenza del web server di sviluppo, si rifiuta di accettare l’upload di un file di dimensioni superiori a 16kb, restituendo uno dei seguenti errori:

(413) Request Entity Too Large

Entità richiesta troppo grande

Maximum request length exceeded

Superata la lunghezza massima della richiesta

Tutti questi errori sono relativi al superamento delle dimensioni massime di un allegato – o meglio, della Request HTTP inviata al server – previste dalla nostra applicazione ASP.NET per impostazione predefinita. Queste limitazioni sono state inserite per una valida ragione: la ricezione di un file è una operazione piuttosto pesante per il server, in quanto impegna a tempo indeterminato un working thread. Per questo motivo, le impostazioni predefinite della maggior parte delle applicazioni ASP.NET prevedono una dimensione generalmente compresa tra i 16k e i 64k, sufficiente per l’invio/ricezione di form di testo ma logicamente del tutto inadeguate quando si ha l’esigenza di gestire l’upload di uno o più file.

(altro…)

 

Come ottenere il Content-Type / MIME Type dall’estensione di un file in ASP.NET C#

Come posso recuperare il MIME Type di un determinato file in C#? Si tratta di una domanda molto frequente tra sviluppatori e che mi capita di sentire spesso da amici e colleghi che lavorano sul framework ASP.NET per realizzare applicazioni MVC, Web API e (ultimamente) .NET Core. Il motivo è semplice: se si lavora di frequente con filesystem e database prima o poi arriva sempre la necessità di recuperare il MIME type di un file, ad esempio al momento di inviarlo al browser dell’utente al termine di una request. In tutti i casi in cui il MIME Type non è stato memorizzato in precedenza, non possiamo fare altro che recuperarlo basandoci sull’estensione del file in questione, che nella maggior parte dei casi fornisce un indizio inequivocabile per identificare la tipologia di file da inviare: abbiamo quindi bisogno di effettuare un mapping tra le varie possibili estensioni che possono avere i nostri file e il MIME Type corrispondente a ciascuna di esse.

Esistono numerose tecniche che consentono di svolgere questa operazione in modo più o meno efficiente. Per ragioni di semplicità ci limiteremo ad approfondirne due: recuperare le informazioni contenute dal Registro di sistema (Windows Registry) o utilizzare a tale scopo una lista statica di tipi MIME (MIME Type Map). Non prenderemo in considerazione tecniche che prevedono di effettuare delle interrogazioni a servizi esterni, in quanto riteniamo che un simile approccio sarebbe assolutamente inefficiente per questo tipo di necessità.

(altro…)