limfx的后端技术栈为mongodb + Asp. Net Core 3.1,我们的开发人员在开发过程中封装了一部分通用的功能,主要包括mongodb的快速CRUD操作,多线程后台Email发送服务,脏字过滤,访问频率限制等,供其他开发者使用,以加快开发速度。这部分代码目前并没有开源,但未来有开源计划。
这个项目尽可能的封装了我们认为开发中常用的功能,并且加入了中文的xml注释,所以如果你觉得文档没说清楚,不必担心,代码提示里会告诉你具体的用法。
这些功能已经封装进入LimFx.Commonnuget包,在创建新项目之后,请安装该nuget包至项目。
注意:limfx的nuget包支持.Net standard 2.1,所以请创建.Net Core 3.0版本以上的项目
在StartUp.cs
的Configure
方法中
app.UseRateLimiter(1000, 10, 3600000, 100, 1000);
第一个参数是ip限制的重设时间,毫秒单位;第二个参数是在重设时间内的某一ip最大允许请求数,若超过该数字则该ip会进入黑名单;第三个参数是进入黑名单后的封禁时间,毫秒单位;第四个是总请求限制数;第五个参数是总请求限制的重设时间,单位为毫秒,该期间内总请求数超过第四个参数的话触发保护,在重设前不再接受请求。
见此处
此方法可以通过在controller或路径方法上添加RateLimitAttribute
来详细自定义某路径在一定时间内被一个ip的上限访问次数
使用此方法需要使用asp的身份认证服务,代码中应当先注入授权和认证服务,例如:
services.AddAuthentication(op=>
{
op.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie();
services.AddAuthorization(op =>
{
op.InvokeHandlersAfterFailure = false;
});
设置
在StartUp.cs
的ConfigureServices
方法中
services.AddEnhancedRateLimiter(ClaimTypes.UserData, 1000, 1000);
第一个参数是用于鉴别不同用户的claim,默认为ClaimTypes.UserData
。建议往这个claim里保存能唯一标识用户的信息,例如ip
第二个参数是重设所有请求记录的间隔,毫秒单位
第三个参数是黑名单屏蔽时间,毫秒单位
使用
在controller上使用
注意:
EnhancedRateLimiter
使用asp身份认证层实现,而RateLimitAttribute
继承自AuthorizeAttribute
,所以使用它默认带有AuthorizeAttribute
的效果。即该功能不应该使用在不需要任何身份认证的路径。
同1,RateLimitAttribute
实际上可以完全代替AuthorizeAttribute
,因此下边两个图等效
在endpoint方法上使用
在controller上使用,计数器仍然然会对每个方法单独计数。例如1中的配置,它会使任何一个用户无法在1秒内对articlecontroller中的某一个endpoint方法发出三个以上的请求,但是该用户对articlecontroller所有endpoints的一秒内请求总和可以超过三次
本文章使用limfx的vsocde插件快速发布