ASP.NET Core如何限制请求频率
ASP.NET Core如何限制請求頻率,為了防止惡意請求,我們往往會(huì)對接口請求的頻率做限制,比如請求間隔,一段時(shí)間內(nèi)請求的次數(shù),針對部分IP做出不同的限制策略
如何去限制請求頻率不需要我們?nèi)?shí)現(xiàn),用上AspNetCoreRateLimit?輪子就好了????
Github地址:https://github.com/stefanprodan/AspNetCoreRateLimit
Nuget下載
Install-Package AspNetCoreRateLimit第一步自然是修改Startup.cs
public void ConfigureServices(IServiceCollection services){
// 需要從appsettings.json中加載配置
services.AddOptions();
// 存儲(chǔ)IP計(jì)數(shù)器及配置規(guī)則services.AddMemoryCache();
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
// 按照文檔,這兩個(gè)是3.x版的breaking change,要加上
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
}
//以及
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 注意順序,放在 UseMvc 上面
app.UseIpRateLimiting();
app.UseMvc();
}
然后向appsettings.json加入限制配置
"IpRateLimiting": { "EnableEndpointRateLimiting": true, "StackBlockedRequests": false, "RealIpHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, "GeneralRules": [ {"Endpoint": "*:/Home/*?",
"Period": "1m",
"Limit": 3
} ] }
EnableEndpointRateLimiting設(shè)置為true,意思是IP限制會(huì)應(yīng)用于單個(gè)配置的Endpoint上。如果是false的話,只會(huì)限制所有 * 的規(guī)則,而不能達(dá)到針對單個(gè)Endpoint配置的目的。
HttpStatusCode設(shè)置為429,意思是觸發(fā)限制之后給客戶端返回的HTTP狀態(tài)碼。
GeneralRules里我只配置了一條,針對/Home這URL的限制。其中,開頭的?*:?表示任何HTTP VERB,如GET/POST,而結(jié)尾的?/*?表示需要考慮/Home后面的參數(shù),也就是我MVC Action參數(shù)里的route參數(shù)。它不會(huì)匹配
Home也不會(huì)匹配Home/*/*
如果您在appsettings.json配置文件中定義了靜態(tài)費(fèi)率策略,則需要在應(yīng)用程序啟動(dòng)時(shí)為它們添加種子:??
public static async Task Main(string[] args){ IWebHost webHost = CreateWebHostBuilder(args).Build();using (var scope = webHost.Services.CreateScope()) { // get the IpPolicyStore instance var ipPolicyStore = scope.ServiceProvider.GetRequiredService<IIpPolicyStore>();
// seed IP data from appsettings await ipPolicyStore.SeedAsync(); }
await webHost.RunAsync();}
當(dāng)請求接口超過限制時(shí)!!!會(huì)出現(xiàn)以下錯(cuò)誤
輪子還提供動(dòng)態(tài)更新限制策略!!!
通過注入IOptions<IpRateLimitOptions>?和IIpPolicyStore可以實(shí)時(shí)更新限制策略
public class SpiderController : BlogControllerBase { private readonly IpRateLimitOptions _options; private readonly IIpPolicyStore _ipPolicyStore; public SpiderController(IOptions<IpRateLimitOptions> optionsAccessor , IIpPolicyStore ipPolicyStore) { _options = optionsAccessor.Value; _ipPolicyStore = ipPolicyStore; }public async Task<IActionResult> Index(SpiderSelectCondition spiderSelect) { var pol = await _ipPolicyStore.GetAsync(_options.IpPolicyPrefix); pol.IpRules.Add(new IpRateLimitPolicy { Ip = "", Rules = new List<RateLimitRule>(new RateLimitRule[] { new RateLimitRule { Endpoint = "*:/Spider/Config", Limit = 2, PeriodTimespan=new TimeSpan(0,0,10), Period ="1d"} }) });
await _ipPolicyStore.SetAsync(_options.IpPolicyPrefix, pol); return View(); }
PeriodTimespan?為間隔時(shí)間
Period?一定時(shí)間內(nèi)可執(zhí)行Limit次
更多高級(jí)用法可以訪問官方文檔
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core如何限制请求频率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AspNetCore应用注意这一点,CT
- 下一篇: 【.NET Core 3.0】小技巧 |