HTTP Basic Authentication con ASP.NET MVC tramite ActionFilter

Errore 403 - forbidden dopo aver pubblicato una applicazione ASP.NET MVC su IIS 7: come risolvere

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:

 

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.

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