紹介
AspNetCoreRateLimit は、ASP.NET Core のレート制限ソリューションであり、クライアントが IP アドレスまたはクライアント ID に基づいて Web API や MVC アプリケーションにリクエストを送信するレートを制御することを目的としています。AspNetCoreRateLimit パッケージには IpRateLimitMiddleware と ClientRateLimitMiddleware が含まれており、各ミドルウェアに対して、IP やクライアントが 1 秒、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 に設定すると、制限はグローバルに適用され、エンドポイントのルールは * のみが適用されます。例えば、1 秒あたり 5 回の呼び出し制限を設定した場合、任意のエンドポイントへの HTTP 呼び出しはすべてその制限にカウントされます。
EnableEndpointRateLimiting を true に設定すると、制限は {HTTP_Verb}{PATH} のように各エンドポイントに適用されます。例えば、*:/api/values に対して 1 秒あたり 5 回の呼び出し制限を設定した場合、GET /api/values は 1 秒間に 5 回呼び出せますが、PUT /api/values も 5 回呼び出せます。
StackBlockedRequests を false に設定すると、拒否されたリクエストはスロットルカウンターに追加されません。クライアントが 1 秒間に 3 つのリクエストを送信し、1 秒あたり 1 回の呼び出し制限を設定している場合、1 分ごとや 1 日ごとのカウンターなどの他の制限には、最初の呼び出し(ブロックされていない呼び出し)のみが記録されます。拒否されたリクエストを他の制限にカウントしたい場合は、StackBlockedRequests を true に設定する必要があります。
RealIpHeader は、Kestrel サーバーがリバースプロキシの背後にある場合にクライアント IP を抽出するために使用され、プロキシが異なるヘッダーを使用する場合は、X-Real-IP の代わりにこのオプションで設定します。
ClientIdHeader は、ホワイトリストに登録されたクライアント ID を抽出するために使用されます。このヘッダーにクライアント ID が存在し、ClientWhitelist に指定された値と一致する場合、レート制限は適用されません。
ここではクライアント IP ベースのレート制限のみを記載しています。このプロジェクトに興味がある場合は、さらに詳しいドキュメントを AspNetCoreRateLimit 公式サイトでご覧ください。
最後に、私の記事を気に入っていただけましたら、フォローしていただけると幸いです。.NET エコシステムがますます良くなることを願っています!