HTTP Basic Authentication con ASP.NET MVC tramite ActionFilter

Nello sviluppo di una applicazione ASP.NET MVC è possibile che prima o poi ci si trovi nella necessità di restringere l’accesso ad una o più risorse web. Se la nostra applicazione prevede un sistema di autenticazione di qualsivoglia tipo (come ad esempio ASP.NET Membership Provider o il più recente ASP.NET Identity) è possibile sfruttare il sistema di utenti e ruoli predefinito per restringere l’accesso alle risorse che vogliamo tramite l’utilizzo dell’attributo AuthorizeAttribute presente nel namespace System.Web.Mvc a livello di Controller o di singolo ActionResult:

Questo approccio richiede però necessariamente che l’utente effettui un login ed è quindi poco indicato qualora si voglia mettere in piedi un WebService o una interfaccia RESTful di qualsivoglia tipo. Per queste situazioni specifiche è probabilmente più indicato uno dei meccanismi di autenticazione previsti dal protocollo HTTP: Basic, Digest, NTLM solo per citarne alcuni. Il più diffuso, nonché il più semplice da supportare in ambiente MVC, è senza dubbio il meccanismo di Basic Authentication, per implementare il quale è sufficiente aggiungere al proprio progetto il seguente attributo ActionFilter personalizzato:

Come si può vedere il filtro controlla la presenza del campo Authorization negli header della Http Request e agisce di conseguenza:

  • Se presente, confronta l’username e la password presenti nella richiesta con quelle previste dal sistema.
  • Se non presente, produce un Http Response di tipo 401 per avvisare il client che per accedere alla risorsa richiesta è necessario l’inserimento di apposite credenziali. Questo tipo di risposta produrrà, nella maggior parte dei browser web, la classica finestra pop-up di inserimento di username e password.

L’implementazione mostrata prevede delle credenziali inserite ad-hoc, ma può essere agevolmente estesa per far sì che l’ActionFilter utilizzi un qualsivoglia sistema di autenticazione personalizzato (MembershipProvider, ASP.NET Identity, base utenti personalizzata su DB esterno o su file, etc.) semplicemente eliminando il costruttore personalizzato e modificando il contenuto del blocco IF presente nell’override del metodo OnActionExecuting.

Il principale vantaggio di gestire la Basic Authentication in questo modo è che l’ ActionFilter così creato può essere utilizzato sia a livello di Controller che di singolo ActionResult, proprio come l’attributo Authorize menzionato sopra:

 

RELATED POSTS

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.

View all posts by Ryan