StartUp.csコード
公共 のボイドConfigureServices(IServiceCollectionサービス) { // appsettings.jsonから設定をロードするために必要な services.AddOptions(); // 店のレート制限カウンタとIP規則に必要な services.AddMemoryCache(); // appsettings.jsonから負荷全体構成 services.Configure <IpRateLimitOptions>(Configuration.GetSection(" IpRateLimiting " )); // appsettings.jsonから負荷のIPルール services.Configure <IpRateLimitPolicies>(Configuration.GetSection(" IpRateLimitPolicies " )); //注入カウンタルール格納 services.AddSingleton <IIpPolicyStore、MemoryCacheIpPolicyStore> (); services.AddSingleton <IRateLimitCounterStore、MemoryCacheRateLimitCounterStore> (); // フレームワークサービスを追加します。 services.AddMvc(); // https://github.com/aspnet/Hosting/issues/793 // IHttpContextAccessorサービスは、デフォルトで登録されていません。 // のclientId /クライアントIPリゾルバはそれを使用します。 services.AddSingleton <IHttpContextAccessor、HttpContextAccessor> (); // 設定(リゾルバ、キービルダーに対抗) services.AddSingleton <IRateLimitConfiguration、RateLimitConfiguration> (); }
// このメソッドはランタイムによって呼び出されます。HTTPリクエストパイプラインを設定するには、このメソッドを使用します。 公共 ボイド設定(IApplicationBuilderアプリ、IHostingEnvironment ENV) { app.UseIpRateLimiting()。 // もし(env.IsDevelopment()) // app.UseDeveloperExceptionPage(); app.UseMvc(); }
IPRateLimitingは、他のミドルウェア前に登録しなければならない、またはAPIリクエストの計算が間違っている可能性があります。
あなたはバランスのアプリケーションをロードする場合は、使用する必要があるIDistributedCache
すべてのチョウゲンボウのインスタンスが同じレート制限のストレージを持っているように、RedisのかSQLServerのを。代わりにMemoryCacheを使用しての、分散ストレージを注入するようになります。
設定と一般的なルールはappsettings.json:
"IpRateLimiting" :{ "EnableEndpointRateLimitingは":偽、 "StackBlockedRequests":偽、 "RealIpHeader": "X-のReal-IP" 、 "ClientIdHeader": "X-ClientIdを" 、 "HttpStatusCode":429 、 // "IpWhitelist" :[ "127.0.0.1"、 ":: 1/10"、 "192.168.0.0/24"]、 // "EndpointWhitelist":[ "取得:/ API /ライセンス"、 "*:/ API /ステータス"] 、 // "ClientWhitelist":[ "DEV-ID-1"、 "DEV-ID-2"]、 "GeneralRules" 。[ { "エンドポイント": "*" 、 "期間": "1" 、 "制限":1 }、 { "エンドポイント": "*" 、 "期間": "15メートル" 、 "制限":100 }、 { "エンドポイント": "*" 、 "期間"、 "12H" 、 "制限":1000 }、 { "エンドポイント": "*" 、 "期間": "7D" 、 "リミット":10000 } ] }
場合はEnableEndpointRateLimiting
、あなたがに設定false
グローバル制限アプリケーション、そして唯一のエンドポイントとして持つルールを適用します*
。あなたは2回目の呼び出しごとに5回の制限を設定した場合、任意のHTTPエンドポイントへの呼び出しは、この制限にカウントされます。
場合はEnableEndpointRateLimiting
設定しtrue
、制限のような、各エンドポイントに適用されます{HTTP_Verb}{PATH}
。あなたがする必要がある場合たとえば、*:/api/values
クライアントコールあたり5の上限を設定し、次のことができGET /api/values
、毎秒5回コールするだけでなく、5回呼び出すことができますPUT /api/values
。
場合StackBlockedRequests
に設定するfalse
API呼び出しを拒否通話カウンタの数に追加されません。例:クライアントは毎秒3つの要求を行い、あなたが毎秒1つのコールの制限を設定した場合、分または他の制限ごとに毎日のカウンタは、API呼び出しの成功ということのみ最初の呼び出しを記録します。あなたが表示APIの呼び出しに含まれることを望む場合に設定する必要があり、他の時間(分、時間、など)拒否StackBlockedRequests
にしますtrue
。
RealIpHeader
使用、ケストレルサーバーがリバースプロキシの背後にある、あなたは別のヘッダーを使用して、クライアントのIP抽出した場合、プロキシサーバーX-Real-IP
を使用するように設定するには、このオプションを選択します。
されますClientIdHeader
、クライアントIDのホワイトリストを抽出するために使用されます。そこにクライアントIDがこのヘッダにあり、ClientWhitelist値が一致を指定した場合、アプリケーションが律速されていません。
の特定のIP appsettings.jsonをカバーする一般的なルール:
"IpRateLimitPolicies" :{ "IpRules" :[ { "IP": "84.247.85.224" 、 "ルール" :[ { "エンドポイント": "*" 、 "期間": "1" 、 "制限":10 }、 { "エンドポイント": "*" 、 "期間": "15メートル" 、 "制限":200 } ] }、 { "IP": "192.168.3.22/25" 、 "ルール":[ { "エンドポイント": "*" 、 "期間": "1"、 "制限":5 }、 { "エンドポイント": "*" 、 "期間": "15メートル" 、 "制限":150 }、 { "エンドポイント": "*" 、 "期間": "12H" 、 "リミット":500 } ] } ] }
フィールドは、 "FE80 :: / 10" または、そのような "192.168.0.0/24" として、IP v6のIP V4と値と範囲をサポートしています "192.168.0.0-192.168.0.255。"