Comment sécuriser les API Web ASP.Net à l'aide de filtres d'autorisation

La sécurité est une préoccupation majeure dans les applications d'entreprise basées sur le Web. Lorsque vous avez besoin de transmettre des données par fil, vous devez être conscient des différents outils que vous pouvez utiliser pour sécuriser ces données.

L'API Web ASP.Net est une infrastructure légère utilisée pour créer des services RESTful sans état qui s'exécutent sur HTTP. Une façon de sécuriser les services de l'API Web consiste à utiliser des filtres d'autorisation.

Idéalement, vous devez effectuer l'authentification et l'autorisation au début du pipeline de l'API Web. Cela permet d'éliminer la surcharge de traitement inutile du cycle de demande. Notez que, que vous utilisiez des modules HTTP ou des gestionnaires de messages HTTP pour l'authentification, vous pouvez récupérer le principal actuel (c'est-à-dire l'utilisateur) de la ApiController.Userpropriété.

Gardez également à l'esprit que les filtres d'autorisation de l'API Web s'exécutent avant les méthodes d'action du contrôleur. Ainsi, si la demande entrante n'est pas autorisée, une erreur sera renvoyée par le service, la demande sera ignorée et la méthode d'action du service ne sera pas exécutée.

Utilisation du filtre d'autorisation AuthorizeAttribute

Le filtre d'autorisation intégré AuthorizeAttributepeut être utilisé pour autoriser les demandes entrantes. Vous pouvez utiliser  AuthorizeAttribute pour vérifier si l'utilisateur est authentifié. Si l'utilisateur n'est pas authentifié, il renverra le code d'état HTTP 401. Cette autorisation peut être appliquée dans l'API Web globalement ou au niveau du contrôleur.

Notez que vous pouvez également implémenter un gestionnaire de messages personnalisé pour autoriser l'accès à vos méthodes de contrôleur car les filtres de messages sont exécutés beaucoup plus tôt dans le cycle de vie de l'API Web.

Pour restreindre l'accès à tous les contrôleurs, vous pouvez ajouter le AuthorizeAttributeglobalement à la Filterscollection de l' HttpConfigurationinstance. L'extrait de code suivant montre comment vous pouvez ajouter le AuthorizeAttributeà la Filterscollection de l' HttpConfigurationobjet.

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());

        } 

Utilisation de l'attribut Authorize 

Au niveau du contrôleur, vous pouvez restreindre l'accès en appliquant l' Authorizeattribut comme indiqué dans l'extrait de code donné ci-après.

[Authorize]

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Vous pouvez également appliquer l' Authorizeattribut au niveau de l'action pour restreindre l'accès à une méthode d'action particulière. L'extrait de code suivant illustre comment cela peut être implémenté.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

   // Require authorization for a specific action.

    [Authorize]

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

Dans l'extrait de code présenté précédemment, l'accès à la Post()méthode est restreint tandis que l'accès à la Get()méthode n'est pas restreint. Vous pouvez également restreindre le contrôleur, puis fournir un accès anonyme à une ou plusieurs méthodes d'action. L'extrait de code qui suit illustre cela.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

    [AllowAnonymous]

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

}

Autoriser les actions par rôles et utilisateurs

Il est également possible de restreindre l'accès aux méthodes d'action par rôles et utilisateurs. L'extrait de code suivant montre comment cela peut être réalisé.

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

public class EmployeesController : ApiController

{

   //Write methods here that correspond to the Http verbs

}

Dans l'exemple ci-dessus, le contrôleur Employés restreint l'accès aux utilisateurs Joydip et Jini uniquement. Le code ci-dessous montre comment vous pouvez restreindre l'accès par rôles.

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

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Vous pouvez toujours accéder à la ApiController.Userpropriété dans la méthode du contrôleur pour récupérer le principe actuel et accorder une autorisation en fonction du rôle de l'utilisateur. Ceci est indiqué dans la liste des codes ci-dessous.

public HttpResponseMessage Get()

{

    if (User.IsInRole(“Administrators”))

    {

        //Write your code here

    }

}

Utilisation de filtres d'autorisation personnalisés dans l'API Web ASP.Net

Un filtre d'autorisation est une classe qui étend la AuthorizationFilterAttributeclasse et remplace la OnAuthorization()méthode. C'est la méthode par laquelle vous pouvez écrire la logique d'autorisation. Si l'autorisation échoue, vous pouvez renvoyer une instance de la UnauthorizedExceptionclasse ou même une personnalisation HttpResponseMessage.

La liste de codes suivante montre comment vous pouvez implémenter une classe personnalisée pour autoriser les requêtes à votre API Web. Notez que vous devez étendre la AuthorizeAttributeclasse pour implémenter votre propre classe de filtre d'autorisation.

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;

        }

    }