ASP.NET CoreRateLimit - ASP.NET Core レート制限ミドルウェア

ASP.NET CoreRateLimit - ASP.NET Core レート制限ミドルウェア

AspNetCoreRateLimit は ASP.NET Core のレート制限ソリューションです

最終更新 2022/07/12 20:26
黑哥聊dotNet
読了目安 2 分
カテゴリ
ASP.NET Core
タグ
.NET C# ASP.NET Core

紹介

AspNetCoreRateLimit は、ASP.NET Core のレート制限ソリューションであり、クライアントが IP アドレスまたはクライアント ID に基づいて Web API や MVC アプリケーションにリクエストを送信するレートを制御することを目的としています。AspNetCoreRateLimit パッケージには IpRateLimitMiddlewareClientRateLimitMiddleware が含まれており、各ミドルウェアに対して、IP やクライアントが 1 秒、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
      }
    ]
  }

EnableEndpointRateLimitingfalse に設定すると、制限はグローバルに適用され、エンドポイントのルールは * のみが適用されます。例えば、1 秒あたり 5 回の呼び出し制限を設定した場合、任意のエンドポイントへの HTTP 呼び出しはすべてその制限にカウントされます。

EnableEndpointRateLimitingtrue に設定すると、制限は {HTTP_Verb}{PATH} のように各エンドポイントに適用されます。例えば、*:/api/values に対して 1 秒あたり 5 回の呼び出し制限を設定した場合、GET /api/values は 1 秒間に 5 回呼び出せますが、PUT /api/values も 5 回呼び出せます。

StackBlockedRequestsfalse に設定すると、拒否されたリクエストはスロットルカウンターに追加されません。クライアントが 1 秒間に 3 つのリクエストを送信し、1 秒あたり 1 回の呼び出し制限を設定している場合、1 分ごとや 1 日ごとのカウンターなどの他の制限には、最初の呼び出し(ブロックされていない呼び出し)のみが記録されます。拒否されたリクエストを他の制限にカウントしたい場合は、StackBlockedRequeststrue に設定する必要があります。

RealIpHeader は、Kestrel サーバーがリバースプロキシの背後にある場合にクライアント IP を抽出するために使用され、プロキシが異なるヘッダーを使用する場合は、X-Real-IP の代わりにこのオプションで設定します。

ClientIdHeader は、ホワイトリストに登録されたクライアント ID を抽出するために使用されます。このヘッダーにクライアント ID が存在し、ClientWhitelist に指定された値と一致する場合、レート制限は適用されません。

ここではクライアント IP ベースのレート制限のみを記載しています。このプロジェクトに興味がある場合は、さらに詳しいドキュメントを AspNetCoreRateLimit 公式サイトでご覧ください。

最後に、私の記事を気に入っていただけましたら、フォローしていただけると幸いです。.NET エコシステムがますます良くなることを願っています!

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2022/06/22

ASP.NET Core WebAPI でローカリゼーションを実装する(単一リソースファイル)

Microsoft のデフォルトは、1 つのクラスに複数のリソースファイルを対応させる方法であり、使用がやや面倒です。本記事では、単一リソースファイルの使用方法を紹介します。つまり、プロジェクト全体のすべてのクラスが 1 セットの多言語リソースファイルに対応します。

続きを読む