ASP.NET Core如何限制请求频率
ASP.NET Core如何限制請求頻率,為了防止惡意請求,我們往往會對接口請求的頻率做限制,比如請求間隔,一段時間內請求的次數,針對部分IP做出不同的限制策略
如何去限制請求頻率不需要我們去實現,用上AspNetCoreRateLimit?輪子就好了????
Github地址:https://github.com/stefanprodan/AspNetCoreRateLimit
Nuget下載
Install-Package AspNetCoreRateLimit第一步自然是修改Startup.cs
public void ConfigureServices(IServiceCollection services){
// 需要從appsettings.json中加載配置
services.AddOptions();
// 存儲IP計數器及配置規(guī)則services.AddMemoryCache();
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
// 按照文檔,這兩個是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設置為true,意思是IP限制會應用于單個配置的Endpoint上。如果是false的話,只會限制所有 * 的規(guī)則,而不能達到針對單個Endpoint配置的目的。
HttpStatusCode設置為429,意思是觸發(fā)限制之后給客戶端返回的HTTP狀態(tài)碼。
GeneralRules里我只配置了一條,針對/Home這URL的限制。其中,開頭的?*:?表示任何HTTP VERB,如GET/POST,而結尾的?/*?表示需要考慮/Home后面的參數,也就是我MVC Action參數里的route參數。它不會匹配
Home也不會匹配Home/*/*
如果您在appsettings.json配置文件中定義了靜態(tài)費率策略,則需要在應用程序啟動時為它們添加種子:??
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();}
當請求接口超過限制時!!!會出現以下錯誤
輪子還提供動態(tài)更新限制策略!!!
通過注入IOptions<IpRateLimitOptions>?和IIpPolicyStore可以實時更新限制策略
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?為間隔時間
Period?一定時間內可執(zhí)行Limit次
更多高級用法可以訪問官方文檔
總結
以上是生活随笔為你收集整理的ASP.NET Core如何限制请求频率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AspNetCore应用注意这一点,CT
- 下一篇: 从AppDomain迁移到Assembl