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/values5 次,但也可以調用 5 次 put/api/values。

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

用於在您的 realipheaderkestrel 伺服器位於反向代理之後時提取客戶端 ip,如果您的代理使用不同的標頭,則 x-real-ip 使用此選項進行設置。

clientidheader 用於提取白名單的客戶端 id 。如果此標頭中存在客戶端 id 並且與 clientwhitelist 中指定的值匹配,則不應用速率限制。

這裡只寫了基於客戶端 ip 的速率限制,如果對此項目感興趣,更多文檔請前往 aspnetcoreratelimit 官網。

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

Keep Exploring

延伸阅读

更多文章