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

功能
基於用戶端 IP 的速率限制
- 設定與配置
- 定義速率限制規則
- 行為
- 執行時期更新速率限制
基於用戶端 ID 的速率限制
- 設定與配置
- 定義速率限制規則
- 行為
- 執行時期更新速率限制
進階配置
- 自訂配額超出回應
- IP / ClientId 解析貢獻者
- 使用 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 生態圈越來越好!