Zurück zur Startseite

ASP.NET Core Ratenbegrenzung Middleware: Architektur & Konfig.

Middleware für Ratenbegrenzung in ASP.NET Core: Architektur, Konfiguration, globale und richtlinienbasierte Ansätze für sichere Webanwendungen.

ASP.NET Core Ratenbegrenzung: Architektur & Konfiguration verstehen
Advertisement 728x90

ASP.NET Core Rate Limiting Middleware: Architektur und Konfiguration

ASP.NET Core bietet einen leistungsstarken, flexiblen Mechanismus zur Begrenzung der Rate eingehender Anfragen, der entscheidend für die Aufrechterhaltung der Stabilität und Sicherheit von Webanwendungen ist. Im Zentrum dieser Funktionalität steht eine spezialisierte _Rate-Limiting-Middleware_, die den Fluss von Anfragen effizient mithilfe der generischen .NET Rate-Limiting-Komponente verwaltet. Das Verständnis ihrer Architektur, Konfigurationsprinzipien und Erweiterbarkeit ermöglicht es erfahrenen Entwicklern, robuste und skalierbare Lösungen zu entwickeln. Dieser Artikel taucht tief in die Konzepte und operativen Mechanismen dieser Komponente ein und geht über die oberflächliche Nutzung hinaus.

Integration und Konfiguration der Rate-Limiting-Middleware in ASP.NET Core

Die _Rate-Limiting-Middleware_ spielt eine zentrale Rolle im Rate-Limiting-System von ASP.NET Core. Sie fängt jede eingehende HTTP-Anfrage ab und entscheidet, ob sie verarbeitet oder abgelehnt wird, basierend auf vordefinierten Regeln. Diese Middleware fungiert als Adapter, der die zugrunde liegenden Begrenzungsalgorithmen der generischen .NET Rate-Limiting-Komponente nutzt.

Um die _Middleware-Komponente_ in die ASP.NET Core Anfragenverarbeitungspipeline zu integrieren, wird die Erweiterungsmethode UseRateLimiter für das IApplicationBuilder-Interface verwendet. Eine zentrale Anforderung für ihre Platzierung in der Pipeline ist die Positionierung zwischen den Aufrufen von UseRouting und UseEndpoints. Dies stellt sicher, dass Begrenzungen angewendet werden, nachdem die Route der Anfrage bestimmt wurde, aber bevor die Anfrage ihren endgültigen Verarbeitungsendpunkt erreicht. In Anwendungen, die auf WebApplication-/WebApplicationBuilder-Templates basieren (ab ASP.NET Core 6.0), ist diese Bedingung oft standardmäßig erfüllt.

Google AdInline article slot

Das Verhalten der _Middleware-Komponente_ wird über _Limiter-Konfigurationsparameter_ konfiguriert, die in einer Instanz der Klasse RateLimiterOptions gekapselt sind. Die UseRateLimiter-Methode hat zwei Hauptformen: Eine ermöglicht die direkte Übergabe einer RateLimiterOptions-Instanz, während die andere, häufiger verwendete, Parameter aus dem Service-Container der Anwendung abruft, im Einklang mit dem Options-Pattern.

Für die volle Funktionalität, einschließlich der Metrik-Erfassung, müssen die notwendigen Dienste im Dependency-Injection-Container registriert werden. Dies geschieht mithilfe der Erweiterungsmethode AddRateLimiter für IServiceCollection. Ab ASP.NET Core 8 ist die Registrierung dieser Dienste obligatorisch. Die AddRateLimiter-Methode dient auch dazu, RateLimiterOptions über einen als Parameter übergebenen Delegaten zu konfigurieren. Mit ASP.NET Core 9 wurde eine Form von AddRateLimiter ohne Delegaten hinzugefügt, was auf alternative Wege zur Bereitstellung von Einstellungen hindeutet. Eine effektive _Konfiguration_ dieser Parameter ist entscheidend für die Leistung und Sicherheit der Anwendung.

Globale und richtlinienbasierte Rate-Limiting-Mechanismen

Die Rate-Limiting-Funktionalität von ASP.NET Core arbeitet mit zwei unabhängigen, aber komplementären Mechanismen: der _globalen Begrenzung_ und der _richtlinienbasierten Begrenzung_. Eine Anfrage wird nur dann erfolgreich verarbeitet, wenn sie von beiden Mechanismen eine Genehmigung erhält. Ist einer von ihnen nicht konfiguriert oder für die aktuelle Anfrage nicht anwendbar, wird seine Genehmigung automatisch als erteilt betrachtet.

Google AdInline article slot

Globale Anfragenbegrenzung

_Globale Begrenzung_ gilt ausnahmslos für alle eingehenden Anfragen. Sie wird konfiguriert, indem eine Instanz eines partitionierten Rate Limiters der Eigenschaft GlobalLimiter in RateLimiterOptions zugewiesen wird. Dieser Limiter muss ein Objekt der Klasse PartitionedRateLimiter sein, parametrisiert mit dem Ressourcentyp HttpContext. Im Kontext von ASP.NET Core wird HttpContext immer als Ressourcentyp für Limiter verwendet. Das Fehlen einer globalen Limiter-Konfiguration deaktiviert diesen Mechanismus. Die Verwaltung des Datenverkehrs auf globaler Ebene dient als erste Verteidigungslinie.

Richtlinienbasierte Anfragenbegrenzung

Für eine granularere Kontrolle über den Anfragenfluss wird die _richtlinienbasierte Begrenzung_ verwendet. _Anfragenbegrenzungsrichtlinien_ ermöglichen die Anwendung spezifischer Begrenzungsregeln auf bestimmte Gruppen von Anfragen, die mit bestimmten Routen oder Routing-Endpunkten verknüpft sind.

Richtlinien werden mithilfe mehrerer Überladungen der AddPolicy-Methode in RateLimiterOptions konfiguriert. Diese Methoden ermöglichen das Hinzufügen benannter _Begrenzungsrichtlinien_ zur Konfiguration.

Google AdInline article slot

Richtlinien können sein:

  • Benannt: In RateLimiterOptions mit einem eindeutigen Bezeichner registriert. Sie können mehrfach wiederverwendet und an verschiedene Routen gebunden werden.
  • Unbenannt: Direkt an eine bestimmte Route gebunden und nicht zur Wiederverwendung an anderer Stelle vorgesehen.

Der Prozess der Konfiguration benannter Richtlinien umfasst zwei Stufen:

  • Hinzufügen einer benannten Richtlinie zu RateLimiterOptions mithilfe von AddPolicy.
  • Binden dieser Richtlinie an eine oder mehrere Routen in der Routing-Konfiguration.

Unbenannte Richtlinien erfordern lediglich die Bindung an eine Route. Dies bietet Flexibilität bei der _Zugriffsverwaltung_ auf verschiedene Endpunkte.

Umgang mit Ablehnungen und Erstellung benutzerdefinierter Richtlinien

Wenn eine Anfrage durch den Rate-Limiting-Mechanismus abgelehnt wird, muss die _Middleware-Komponente_ spezifische Aktionen ausführen. Dieses Verhalten wird über die Eigenschaften OnRejected und RejectionStatusCode in RateLimiterOptions konfiguriert.

Die Eigenschaft RejectionStatusCode definiert den HTTP-Statuscode, der an den Client zurückgegeben wird (z.B. 503 Service Unavailable oder 429 Too Many Requests). Die Eigenschaft OnRejected ermöglicht die Angabe eines _Ablehnungs-Handlers_ – eines asynchronen Delegaten (ValueTask), der HttpContext und ein Ablehnungskontextobjekt akzeptiert. Dieser Delegat ist dazu gedacht, die Antwort zu modifizieren, beispielsweise um Retry-After-Header hinzuzufügen oder detailliertere Informationen über die Ablehnungsgründe bereitzustellen.

Es ist wichtig zu beachten, dass _Begrenzungsrichtlinien_ ihren eigenen spezifischen Ablehnungs-Handler haben können. Fällt eine Anfrage unter eine Richtlinie, die sowohl einen globalen Handler als auch einen richtlinienspezifischen Handler definiert hat, wird immer dem innerhalb der Richtlinie angegebenen Handler Priorität eingeräumt. Dieser Mechanismus ermöglicht eine Feinabstimmung der Reaktionen auf _abgelehnte Anfragen_.

Entwicklung benutzerdefinierter Rate-Limiting-Richtlinien

Um komplexe und benutzerdefinierte _Begrenzungsszenarien_ zu implementieren, die über Standardkonfigurationen hinausgehen, bietet ASP.NET Core die Möglichkeit, _benutzerdefinierte Anfragenbegrenzungsrichtlinien_ zu erstellen. Eine solche Richtlinie muss das generische Interface IRateLimiterPolicy<TPartitionKey> implementieren, wobei TPartitionKey den Typ des Partitionierungsschlüssels definiert.

Das IRateLimiterPolicy<TPartitionKey>-Interface definiert zwei Schlüsselelemente:

  • Die GetPartition-Methode: Dies ist die _Partitionierungsmethode_, die basierend auf dem aktuellen HttpContext Daten für eine Partition mit dem angegebenen Partitionierungsschlüsseltyp zurückgibt. Sie ermöglicht die dynamische Auswahl des zugrunde liegenden Limiters für eine Anfrage, beispielsweise basierend auf der IP-Adresse des Clients, der Benutzer-ID, einem Header-Wert oder anderen HttpContext-Parametern. Dies macht das Rate Limiting selektiv, indem es ermöglicht, unterschiedliche Limits auf verschiedene Anfragengruppen anzuwenden, selbst wenn sie unter dieselbe Richtlinie fallen.
  • Die OnRejected-Eigenschaft: Wie bereits erwähnt, ermöglicht sie die Definition eines spezifischen Ablehnungs-Handlers für diese spezielle Richtlinie, der den globalen Handler überschreibt.

Objekte, die IRateLimiterPolicy<TPartitionKey> implementieren, werden von der _Middleware-Komponente_ verwendet, um sogenannte _vorbereitete Richtlinien_ zu erstellen, die direkt auf die _Anfragenverarbeitung_ angewendet werden. In aktuellen Versionen können neben Klassen, die dieses Interface implementieren, auch Partitionierungs-Delegaten mit HttpContext als Ressourcentyp als Basis für benannte Richtlinien dienen.

Die Anwendung benutzerdefinierter Richtlinien und der _Partitionierung_ bietet Entwicklern eine außergewöhnliche Flexibilität bei der Erstellung präziser und adaptiver Rate-Limiting-Systeme, die den einzigartigen Anforderungen von Hochlastanwendungen, Microservice-Architekturen oder öffentlichen APIs gerecht werden können. Dies trägt zu einem effektiven _Ressourcenmanagement_ und zur Missbrauchsverhinderung bei.

Wichtige Erkenntnisse

  • Rate-Limiting-Middleware in ASP.NET Core ist eine Schlüsselkomponente für die Datenverkehrssteuerung und Sicherheit, integriert mit dem generischen .NET Rate-Limiting-Mechanismus.
  • Die Funktionalität wird über RateLimiterOptions konfiguriert, wobei UseRateLimiter für die Pipeline und AddRateLimiter für die Dienstregistrierung und Konfiguration verwendet wird.
  • Das System unterstützt zwei Ebenen des Rate Limiting: die _globale Begrenzung_ für alle Anfragen und die _richtlinienbasierte_ für eine granulare Kontrolle über spezifische Routen.
  • Die Ablehnungsbehandlung wird über OnRejected und RejectionStatusCode konfiguriert, mit der Option zur Überschreibung auf Richtlinienebene.
  • _Benutzerdefinierte Richtlinien_, die IRateLimiterPolicy<TPartitionKey> implementieren, ermöglichen eine komplexe _Partitionierung_ basierend auf HttpContext für die dynamische Limiter-Auswahl und die Anpassung der Ablehnungslogik.

— Editorial Team

Advertisement 728x90

Weiterlesen