Come proteggere le API Web ASP.Net utilizzando i filtri di autorizzazione

La sicurezza è una delle principali preoccupazioni nelle applicazioni aziendali basate sul Web. Quando è necessario trasmettere dati in rete, è necessario essere consapevoli dei vari strumenti che è possibile utilizzare per proteggere tali dati.

L'API Web ASP.Net è un framework leggero utilizzato per la creazione di servizi RESTful senza stato eseguiti su HTTP. Un modo per proteggere i servizi API Web è con i filtri di autorizzazione.

Idealmente, dovresti eseguire l'autenticazione e l'autorizzazione nelle prime fasi della pipeline dell'API Web. Ciò consente di eliminare il sovraccarico di elaborazione non necessario dal ciclo di richieste. Si noti che, sia che si utilizzino moduli HTTP o gestori di messaggi HTTP per l'autenticazione, è possibile recuperare l'entità corrente (ovvero l'utente) dalla ApiController.Userproprietà.

Inoltre, tieni presente che i filtri di autorizzazione dell'API Web vengono eseguiti prima dei metodi di azione del controller. Quindi, se la richiesta in arrivo non è autorizzata, verrà restituito un errore dal servizio, la richiesta verrà ignorata e il metodo di azione del servizio non verrà eseguito.

Utilizzo del filtro di autorizzazione AuthorizeAttribute

Il filtro di autorizzazione integrato AuthorizeAttributepuò essere utilizzato per autorizzare le richieste in arrivo. È possibile utilizzare  AuthorizeAttribute per verificare se l'utente è autenticato. Se l'utente non è autenticato, restituirà il codice di stato HTTP 401. Questa autorizzazione può essere applicata nell'API Web a livello globale oa livello di controller.

Si noti che è anche possibile implementare un gestore di messaggi personalizzato per autorizzare l'accesso ai metodi del controller poiché i filtri dei messaggi vengono eseguiti molto prima nel ciclo di vita dell'API Web.

Per limitare l'accesso a tutti i controller, è possibile aggiungere AuthorizeAttributeglobalmente alla Filtersraccolta HttpConfigurationdell'istanza. Il frammento di codice seguente mostra come è possibile aggiungere AuthorizeAttributealla Filtersraccolta HttpConfigurationdell'oggetto.

public static void Register(HttpConfiguration config)

        {

            // Web API configuration and services 

            // Web API routes

            config.MapHttpAttributeRoutes(); 

            config.Routes.MapHttpRoute(

                name: “DefaultApi”,

                routeTemplate: “api/{controller}/{id}”,

                defaults: new { id = RouteParameter.Optional }

            ); 

            config.Filters.Add(new AuthorizeAttribute());

        } 

Utilizzando l'attributo Authorize 

A livello di controller, puoi limitare l'accesso applicando l' Authorizeattributo come mostrato nello snippet di codice fornito di seguito.

[Authorize]

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

È inoltre possibile applicare l' Authorizeattributo a livello di azione per limitare l'accesso a un particolare metodo di azione. Il frammento di codice seguente illustra come implementarlo.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

   // Require authorization for a specific action.

    [Authorize]

    public HttpResponseMessage Post(Employee emp) { //Some code }

Nello snippet di codice mostrato in precedenza, l'accesso al Post()metodo è limitato mentre l'accesso al Get()metodo non è limitato. È inoltre possibile limitare il controller e quindi fornire l'accesso anonimo a uno o più metodi di azione. Lo snippet di codice che segue lo illustra.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

    [AllowAnonymous]

    public HttpResponseMessage Post(Employee emp) { //Some code }

}

Autorizza le azioni per ruoli e utenti

È anche possibile limitare l'accesso ai metodi di azione per ruoli e utenti. Il frammento di codice seguente mostra come ottenere questo risultato.

[Authorize(Users="Joydip,Jini")] //Restrict access by user

public class EmployeesController : ApiController

{

   //Write methods here that correspond to the Http verbs

}

Nell'esempio precedente, il controller Employees limita l'accesso solo agli utenti Joydip e Jini. Il codice seguente mostra come limitare l'accesso in base ai ruoli.

[Authorize(Roles="Administrators")] //Restrict by roles

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

È sempre possibile accedere alla ApiController.Userproprietà all'interno del metodo controller per recuperare il principio corrente e concedere l'autorizzazione in base al ruolo dell'utente. Questo è mostrato nell'elenco dei codici di seguito.

public HttpResponseMessage Get()

{

    if (User.IsInRole(“Administrators”))

    {

        //Write your code here

    }

}

Utilizzo di filtri di autorizzazione personalizzati nell'API Web ASP.Net

Un filtro di autorizzazione è una classe che estende la AuthorizationFilterAttributeclasse e sovrascrive il OnAuthorization()metodo. Questo è il metodo in cui è possibile scrivere la logica di autorizzazione. Se l'autorizzazione fallisce puoi restituire un'istanza della UnauthorizedExceptionclasse o anche una custom HttpResponseMessage.

L'elenco di codice seguente mostra come implementare una classe personalizzata per autorizzare le richieste all'API Web. Notare che è necessario estendere la AuthorizeAttributeclasse per implementare la propria classe di filtro di autorizzazione.

public class CustomAuthorizeAttribute : AuthorizeAttribute

    {

         public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            if (AuthorizeRequest(actionContext))

            {

                return;

            }

            HandleUnauthorizedRequest(actionContext);

        }

        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

           //Code to handle unauthorized request

        }

        private bool AuthorizeRequest(System.Web.Http.Controllers.HttpActionContext actionContext)

        {

            //Write your code here to perform authorization

            return true;

        }

    }