ASP.NET CoreRateLimit - ASP.NET Core 速率限制中介軟體

ASP.NET CoreRateLimit - ASP.NET Core 速率限制中介軟體

AspNetCoreRateLimit 是一種 ASP.NET Core 速率限制解決方案

最後更新 2022/7/12 下午8:26
黑哥聊dotNet
預計閱讀 4 分鐘
分類
ASP.NET Core
標籤
.NET C# ASP.NET Core

介紹

AspNetCoreRateLimit 是一種 ASP.NET Core 速率限制解決方案,旨在控制客戶端可以根據 IP 位址或用戶端 ID 向 Web API 或 MVC 應用程式發出請求的速率。AspNetCoreRateLimit 套件包含一個 IpRateLimitMiddleware 和一個 ClientRateLimitMiddleware,對於每個中介軟體,您可以為不同的場景設定多個限制,例如允許 IP 或用戶端在每秒、15 分鐘等時間間隔內進行最大呼叫次數。您可以定義這些限制來解決對 API 發出的所有請求,或者您可以將限制範圍限定為每個 API URL 或 HTTP 動詞和路徑。

網址: https://github.com/stefanprodan/AspNetCoreRateLimit

功能

基於用戶端 IP 的速率限制

  1. 設定與配置
  2. 定義速率限制規則
  3. 行為
  4. 執行時期更新速率限制

基於用戶端 ID 的速率限制

  1. 設定與配置
  2. 定義速率限制規則
  3. 行為
  4. 執行時期更新速率限制

進階配置

  1. 自訂配額超出回應
  2. IP / ClientId 解析貢獻者
  3. 使用 Redis 作為分散式計數器儲存

使用方式(基於用戶端 IP 的速率限制)

NuGet 安裝:

Install-Package AspNetCoreRateLimit

Install-Package AspNetCoreRateLimit.Redis

Startup.cs 程式碼:

public void ConfigureServices(IServiceCollection services)
{
  services.AddOptions();
  services.AddMemoryCache();
  services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
  services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));
  services.AddInMemoryRateLimiting();
  services.AddMvc();
   services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseIpRateLimiting();

  app.UseMvc();
}

appsettings.json:

"IpRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
    "EndpointWhitelist": [ "get:/api/license", "*:/api/status" ],
    "ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "1s",
        "Limit": 2
      },
      {
        "Endpoint": "*",
        "Period": "15m",
        "Limit": 100
      },
      {
        "Endpoint": "*",
        "Period": "12h",
        "Limit": 1000
      },
      {
        "Endpoint": "*",
        "Period": "7d",
        "Limit": 10000
      }
    ]
  }

如果 EnableEndpointRateLimiting 設為 false,則限制將在全域範圍內應用,並且僅適用於端點的規則 *。例如,如果您設定每秒 5 次呼叫的限制,則對任何端點的任何 HTTP 呼叫都將計入該限制。

如果 EnableEndpointRateLimiting 設為 true,則限制將適用於每個端點,如。例如,如果您為 *:/api/values 用戶端設定每秒呼叫 5 次的限制,則每秒可以呼叫 GET /api/values 5 次,但也可以呼叫 5 次 PUT /api/values。

如果 StackBlockedRequests 設為 false,則拒絕的呼叫不會添加到節流計數器。如果用戶端每秒發出 3 個請求,並且您設定了每秒一個呼叫的限制,則其他限制(例如每分鐘或每天計數器)將僅記錄第一個呼叫,即未被阻止的呼叫。如果您希望被拒絕的請求計入其他限制,您必須設定 StackBlockedRequests 為 true。

用於在您的 RealIpHeader Kestrel 伺服器位於反向代理之後時提取用戶端 IP,如果您的代理使用不同的標頭,則 X-Real-IP 使用此選項進行設定。

ClientIdHeader 用於提取白名單的用戶端 ID 。如果此標頭中存在用戶端 ID 並且與 ClientWhitelist 中指定的值相符,則不應用速率限制。

這裡只寫了基於用戶端 IP 的速率限制,如果對此專案感興趣,更多文件請前往 AspNetCoreRateLimit 官網。

最後大家如果喜歡我的文章,還麻煩給個關注,希望 .NET 生態圈越來越好!

繼續探索

延伸閱讀

更多文章