如何在 Asp.Net Core 中对请求进行限流
为什么限流
在应用程序开发时,或许你有这样的想法,控制用户的请求频率来防止一些用户的恶意攻击,具体的说就是:为了预防有名的 拒绝服务 攻击,限制某一个ip在一段时间内的访问次数,要解决这个问题,就要用到限流机制。
限流能够很好的控制住一个客户端访问服务器资源地址的请求次数,在 asp.net core 之前,要实现限流机制,你可能要自定义 module 或者 handler,太繁琐了,不过很开心的是,在 asp.net core 里,可以很轻松的实现限流功能,这得益于 asp.net core 特有的 pipeline 机制,接下来,我们一起研究一下如何在 asp.net core 中实现限流机制。
安装限流中间件
- AspNetCoreRateLimit
配置AspNetCoreRateLimit
将请求追加到 request-response pipeline 管道中
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion
(CompatibilityVersion.Version_2_2);
services.AddOptions();
services.AddMemoryCache();
services.Configure<IpRateLimitOptions>
(Configuration.GetSection("IpRateLimit"));
services.AddSingleton<IIpPolicyStore,
MemoryCacheIpPolicyStore>();
services.AddSingleton<IRateLimitCounterStore,
MemoryCacheRateLimitCounterStore>();
services.AddSingleton<IRateLimitConfiguration,
RateLimitConfiguration>();
services.AddHttpContextAccessor();
}
}
接下来在 Configure 方法中使用限流中间件
public class Startup
{
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
//使用
app.UseIpRateLimiting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
限流规则
"IpRateLimit": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIPHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"GeneralRules": [
{
"Endpoint": "*/weatherforecast",
"Period": "1m",
"Limit": 5
}
]
}