Cómo proteger las API web de ASP.Net mediante filtros de autorización

La seguridad es una preocupación importante en las aplicaciones empresariales basadas en web. Cuando necesite transmitir datos por cable, debe conocer las diversas herramientas que puede utilizar para proteger esos datos.

ASP.Net Web API es un marco ligero que se utiliza para crear servicios RESTful sin estado que se ejecutan en HTTP. Una forma de proteger los servicios de API web es con filtros de autorización.

Idealmente, debería realizar la autenticación y la autorización al principio de la canalización de la API web. Esto ayuda a eliminar la sobrecarga de procesamiento innecesaria del ciclo de solicitud. Tenga en cuenta que, ya sea que utilice módulos HTTP o controladores de mensajes HTTP para la autenticación, puede recuperar el principal actual (es decir, el usuario) de la ApiController.Userpropiedad.

También tenga en cuenta que los filtros de autorización de la API web se ejecutan antes que los métodos de acción del controlador. Entonces, si la solicitud entrante no está autorizada, el servicio devolverá un error, la solicitud se ignorará y el método de acción del servicio no se ejecutará.

Uso del filtro de autorización AuthorizeAttribute

El filtro de autorización integrado AuthorizeAttributese puede utilizar para autorizar solicitudes entrantes. Puede utilizar  AuthorizeAttribute para comprobar si el usuario está autenticado. Si el usuario no está autenticado, devolverá el código de estado HTTP 401. Esta autorización se puede aplicar en la API web de forma global o en el nivel del controlador.

Tenga en cuenta que también puede implementar un controlador de mensajes personalizado para autorizar el acceso a los métodos de su controlador, ya que los filtros de mensajes se ejecutan mucho antes en el ciclo de vida de la API web.

Para restringir el acceso a todos los controladores, puede agregar AuthorizeAttributeglobalmente a la Filterscolección de la HttpConfigurationinstancia. El siguiente fragmento de código muestra cómo puede agregar AuthorizeAttributea la Filterscolección del HttpConfigurationobjeto.

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

        } 

Usando el atributo Authorize 

En el nivel del controlador, puede restringir el acceso aplicando el Authorizeatributo como se muestra en el fragmento de código que se proporciona a continuación.

[Authorize]

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

También puede aplicar el Authorizeatributo en el nivel de acción para restringir el acceso a un método de acción en particular. El siguiente fragmento de código ilustra cómo se puede implementar.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

   // Require authorization for a specific action.

    [Authorize]

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

En el fragmento de código que se mostró anteriormente, el acceso al Post()método está restringido, mientras que el acceso al Get()método no está restringido. También puede restringir el controlador y luego proporcionar acceso anónimo a uno o más métodos de acción. El fragmento de código que sigue ilustra esto.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

    [AllowAnonymous]

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

}

Autorizar acciones por roles y usuarios

También es posible restringir el acceso a los métodos de acción por roles y usuarios. El siguiente fragmento de código muestra cómo se puede lograr.

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

public class EmployeesController : ApiController

{

   //Write methods here that correspond to the Http verbs

}

En el ejemplo anterior, el controlador de empleados restringe el acceso a los usuarios Joydip y Jini únicamente. El siguiente código muestra cómo puede restringir el acceso por roles.

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

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Siempre puede acceder a la ApiController.Userpropiedad dentro del método del controlador para recuperar el principio actual y otorgar autorización según el rol del usuario. Esto se muestra en la lista de códigos a continuación.

public HttpResponseMessage Get()

{

    if (User.IsInRole(“Administrators”))

    {

        //Write your code here

    }

}

Uso de filtros de autorización personalizados en ASP.Net Web API

Un filtro de autorización es una clase que amplía la AuthorizationFilterAttributeclase y anula el OnAuthorization()método. Este es el método en el que puede escribir la lógica de autorización. Si la autorización falla, puede devolver una instancia de la UnauthorizedExceptionclase o incluso una personalizada HttpResponseMessage.

La siguiente lista de códigos muestra cómo puede implementar una clase personalizada para autorizar solicitudes a su API web. Tenga en cuenta que debe ampliar la AuthorizeAttributeclase para implementar su propia clase de filtro de autorización.

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;

        }

    }