Volver al inicio

Limitación de Tasas ASP.NET Core: Arquitectura y Configuración

Descubre cómo el middleware de limitación de tasas en ASP.NET Core protege tus aplicaciones. Aprende su arquitectura, configuración y cómo crear políticas personalizadas para un control robusto.

ASP.NET Core: Limitación de Tasas, Arquitectura y Configuración
Advertisement 728x90

Middleware de Limitación de Tasas en ASP.NET Core: Arquitectura y Configuración

ASP.NET Core ofrece un mecanismo potente y flexible para limitar la tasa de solicitudes entrantes, lo cual es crucial para mantener la estabilidad y seguridad de las aplicaciones web. En el corazón de esta funcionalidad reside un _middleware de limitación de tasas_ especializado, que gestiona eficientemente el flujo de solicitudes utilizando el componente genérico de limitación de tasas de .NET. Comprender su arquitectura, principios de configuración y extensibilidad permite a los desarrolladores de nivel intermedio a sénior construir soluciones robustas y escalables. Este artículo profundiza en los conceptos y mecanismos operativos de este componente, yendo más allá del uso superficial.

Integración y Configuración del Middleware de Limitación de Tasas en ASP.NET Core

El _middleware de limitación de tasas_ juega un papel central en el sistema de limitación de tasas de ASP.NET Core. Intercepta cada solicitud HTTP entrante, decidiendo si procesarla o rechazarla basándose en reglas predefinidas. Este middleware actúa como un adaptador, aprovechando los algoritmos de limitación subyacentes proporcionados por el componente genérico de limitación de tasas de .NET.

Para integrar el _componente middleware_ en el pipeline de procesamiento de solicitudes de ASP.NET Core, se utiliza el método de extensión UseRateLimiter para la interfaz IApplicationBuilder. Un requisito clave para su ubicación en el pipeline es posicionarlo entre las llamadas a UseRouting y UseEndpoints. Esto asegura que las limitaciones se apliquen después de que la ruta de la solicitud haya sido determinada, pero antes de que la solicitud llegue a su punto final de procesamiento. En aplicaciones construidas sobre plantillas WebApplication/WebApplicationBuilder (a partir de ASP.NET Core 6.0), esta condición a menudo se cumple por defecto.

Google AdInline article slot

El comportamiento del _componente middleware_ se configura a través de _parámetros de configuración del limitador_, encapsulados dentro de una instancia de la clase RateLimiterOptions. El método UseRateLimiter tiene dos formas principales: una permite pasar directamente una instancia de RateLimiterOptions, mientras que la otra, más comúnmente utilizada, recupera los parámetros del contenedor de servicios de la aplicación, alineándose con el patrón Options.

Para una funcionalidad completa, incluida la recopilación de métricas, los servicios necesarios deben registrarse en el contenedor de inyección de dependencias. Esto se hace utilizando el método de extensión AddRateLimiter para IServiceCollection. A partir de ASP.NET Core 8, el registro de estos servicios es obligatorio. El método AddRateLimiter también sirve para configurar RateLimiterOptions a través de un delegado pasado como parámetro. Con ASP.NET Core 9, se añadió una forma de AddRateLimiter sin delegado, lo que implica formas alternativas de proporcionar configuraciones. La _configuración_ efectiva de estos parámetros es crítica para el rendimiento y la seguridad de la aplicación.

Mecanismos de Limitación de Tasas Global y Basada en Políticas

La funcionalidad de limitación de tasas de ASP.NET Core opera con dos mecanismos independientes pero complementarios: la _limitación global_ y la _limitación basada en políticas_. Una solicitud solo se procesará con éxito si recibe permiso de ambos mecanismos. Si uno de ellos no está configurado o no es aplicable a la solicitud actual, su permiso se considera automáticamente concedido.

Google AdInline article slot

Limitación Global de la Tasa de Solicitudes

La _limitación global_ se aplica a todas las solicitudes entrantes sin excepción. Se configura asignando una instancia de un limitador de tasas particionado a la propiedad GlobalLimiter en RateLimiterOptions. Este limitador debe ser un objeto de la clase PartitionedRateLimiter, parametrizado con el tipo de recurso HttpContext. En el contexto de ASP.NET Core, HttpContext siempre se utiliza como tipo de recurso para los limitadores. La ausencia de configuración del limitador global desactiva este mecanismo. La gestión del tráfico a nivel global sirve como primera línea de defensa.

Limitación de Tasas Basada en Políticas

Para un control más granular sobre el flujo de solicitudes, se utiliza la _limitación basada en políticas_. Las _políticas de limitación de solicitudes_ permiten aplicar reglas de limitación específicas a ciertos grupos de solicitudes, asociadas con rutas o puntos finales de enrutamiento particulares.

Las políticas se configuran utilizando varias sobrecargas del método AddPolicy en RateLimiterOptions. Estos métodos permiten añadir _políticas de limitación_ con nombre a la configuración.

Google AdInline article slot

Las políticas pueden ser:

  • Con nombre: Registradas en RateLimiterOptions con un identificador único. Pueden reutilizarse varias veces y vincularse a diversas rutas.
  • Sin nombre: Vinculadas directamente a una ruta específica y no destinadas a ser reutilizadas en otro lugar.

El proceso de configuración de políticas con nombre implica dos etapas:

  • Añadir una política con nombre a RateLimiterOptions utilizando AddPolicy.
  • Vincular esta política a una o más rutas en la configuración de enrutamiento.

Las políticas sin nombre solo requieren vincularse a una ruta. Esto proporciona flexibilidad en la _gestión del acceso_ a varios puntos finales.

Manejo de Rechazos y Creación de Políticas Personalizadas

Cuando una solicitud es rechazada por el mecanismo de limitación de tasas, el _componente middleware_ debe realizar acciones específicas. Este comportamiento se configura a través de las propiedades OnRejected y RejectionStatusCode en RateLimiterOptions.

La propiedad RejectionStatusCode define el código de estado HTTP que se devolverá al cliente (por ejemplo, 503 Servicio No Disponible o 429 Demasiadas Solicitudes). La propiedad OnRejected permite especificar un _manejador de rechazo_ — un delegado asíncrono (ValueTask) que acepta HttpContext y un objeto de contexto de rechazo. Este delegado está destinado a modificar la respuesta, por ejemplo, para añadir encabezados Retry-After o proporcionar información más detallada sobre las razones del rechazo.

Es importante señalar que las _políticas de limitación_ pueden tener su propio manejador de rechazo específico. Si una solicitud que cae bajo una política tiene definidos tanto un manejador global como uno específico de la política, la prioridad siempre se otorga al manejador especificado dentro de la política. Este mecanismo permite ajustar con precisión las reacciones a las _solicitudes rechazadas_.

Desarrollo de Políticas de Limitación de Tasas Personalizadas

Para implementar escenarios de _limitación_ complejos y personalizados que van más allá de las configuraciones estándar, ASP.NET Core ofrece la capacidad de crear _políticas de limitación de solicitudes personalizadas_. Dicha política debe implementar la interfaz genérica IRateLimiterPolicy<TPartitionKey>, donde TPartitionKey define el tipo de clave de partición.

La interfaz IRateLimiterPolicy<TPartitionKey> define dos elementos clave:

  • El método GetPartition: Este es el _método de particionamiento_ que, basándose en el HttpContext actual, devuelve datos para una partición con el tipo de clave de partición especificado. Permite seleccionar dinámicamente el limitador subyacente para una solicitud, por ejemplo, basándose en la dirección IP del cliente, el ID de usuario, el valor de un encabezado u otros parámetros de HttpContext. Esto hace que la limitación de tasas sea selectiva, permitiendo que se apliquen diferentes límites a distintos grupos de solicitudes, incluso si caen bajo la misma política.
  • La propiedad OnRejected: Como se mencionó anteriormente, permite definir un manejador de rechazo específico para esta política particular, anulando el manejador global.

Los objetos que implementan IRateLimiterPolicy<TPartitionKey> son utilizados por el _componente middleware_ para crear las llamadas _políticas preparadas_, que se aplican directamente al _procesamiento de solicitudes_. En las versiones actuales, además de las clases que implementan esta interfaz, los delegados de particionamiento con HttpContext como tipo de recurso también pueden servir como base para políticas con nombre.

La aplicación de políticas personalizadas y el _particionamiento_ proporcionan a los desarrolladores una flexibilidad excepcional para crear sistemas de limitación de tasas precisos y adaptativos, capaces de satisfacer los requisitos únicos de aplicaciones de alta carga, arquitecturas de microservicios o APIs públicas. Esto contribuye a una _gestión de recursos_ efectiva y a la prevención de abusos.

Puntos Clave

  • El Middleware de Limitación de Tasas en ASP.NET Core es un componente clave para el control del tráfico y la seguridad, integrado con el mecanismo genérico de limitación de tasas de .NET.
  • La funcionalidad se configura a través de RateLimiterOptions utilizando UseRateLimiter para el pipeline y AddRateLimiter para el registro y configuración de servicios.
  • El sistema soporta dos niveles de limitación de tasas: _limitación global_ para todas las solicitudes y _basada en políticas_ para un control granular sobre rutas específicas.
  • El manejo de rechazos se configura a través de OnRejected y RejectionStatusCode, con la opción de anular a nivel de política.
  • Las _políticas personalizadas_, que implementan IRateLimiterPolicy<TPartitionKey>, permiten un _particionamiento_ complejo basado en HttpContext para la selección dinámica del limitador y la personalización de la lógica de rechazo.

— Editorial Team

Advertisement 728x90

Leer después