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计数器及配置规则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的话,只会限制所有 * 的规则,而不能达到针对单个Endpoint配置的目的。

HttpStatusCode设置为429,意思是触发限制之后给客户端返回的HTTP状态码。

GeneralRules里我只配置了一条,针对/Home这URL的限制。其中,开头的 *: 表示任何HTTP VERB,如GET/POST,而结尾的 /* 表示需要考虑/Home后面的参数,也就是我MVC Action参数里的route参数。它不会匹配

Home也不会匹配Home/*/*

如果您在appsettings.json配置文件中定义了静态费率策略,则需要在应用程序启动时为它们添加种子:  

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();}

当请求接口超过限制时!!!会出现以下错误

轮子还提供动态更新限制策略!!!

通过注入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 一定时间内可执行Limit次

更多高级用法可以访问官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从AppDomain迁移到AssemblyLoadContext

AssemblyLoadContext基本上AssemblyLoadContext是AppDomain的继承者&#xff0c;它提供相同而且更多的功能-除了安全边界&#xff08;隔离&#xff09;。最小的安全边界是进程&#xff0c;因此你将需要使用进程间通信来正确隔离数据和代码执行。官网文档中提到Appdomain已经过时…

大话数据结构学习笔记一:第一章

1.1 基本概念与术语 数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可以操作的对象&#xff0c;是能被计算机识别&#xff0c;并输入给计算机处理的符号集合。 数据元素&#xff1a;是组成数据的、有一定意义的基本单位&#xff0c;在计算机中通常作为整体处理…

【.NET Core 3.0】小技巧 || 原生DI一对多注入

本文是一个技巧文章&#xff0c;内容很短&#xff0c;但是被提问的频率很高&#xff0c;所以记录下来&#xff0c;以待大家不时之需。以下的代码&#xff0c;是通过原生的依赖注入来讲解的&#xff0c;其他的第三方框架&#xff0c;可以自己自定义扩展&#xff0c;效果是一样的…

大话数据结构学习笔记二:算法

一 算法定义 算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 二 算法的特性&#xff1a; 1 输入输出&#xff1a;算法具有零个或者多个输入&#xff0c;至少有一个或者多个输出。 2 有穷性&…

python 学习中遇到的问题(持续更新中)

1、定义一个一维数组,然后利用.T进行转置,利用.T[2]求转置后的数组的第二行。 import numpy as npAnp.array([1,2,3,4,5,6,7,8,9,10,11,12]) BA.reshape(3,4) CB.T DB.T[2] >>> B[[1,2,3,4] [5,6,7,8] [9,10,11,12]] C[[1,5,9] [2,6,10] [3,7,11] [4,8,12] D[3,7…

ASP.NET Core 3.0 gRPC 身份认证和授权

一.开头聊骚本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了&#xff0c;以后在实际使用中&#xff0c;可能会发一些经验之文。本文主要讲 ASP.NET Core 本身的认证授权和gRPC接入&#xff0c;认证方式采用目前主流的 JWT 结合 IdentityServer4。二.服务端配置我们…

ASP.NET Core中使用MediatR实现命令和中介者模式

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9866068.html在本文中&#xff0c;我将解释命令模式&#xff0c;以及如何利用基于命令模式的第三方库来实现它们&#xff0c;以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此…

python 批量处理图片

将需要处理的图片放在同一个文件夹中 from PIL import Image import os source_path "D:\\work\\test_image\\" target_path "D:\\work\\poly_out\\" image_list os.listdir(source_path) for file in image_list:in_filename source_pathfileimg Im…

python 读取 10 bit YUV 文件

最近博主在做HDR2SDR 的项目&#xff0c;在用python做demo的过程中遇到一个问题&#xff0c;输入是HDR的视频&#xff08;H.265, YUV420P10LE, BT2020&#xff0c; 25fps的MKV文件&#xff09;&#xff0c;由于MKV文件是10bit的&#xff0c;博主直接使用 cv2.VideoCapture() 函…

给 IConfiguration 写一个 GetAppSetting 扩展方法

给 IConfiguration 写一个 GetAppSetting 扩展方法Intro在 .net core 中&#xff0c;微软已经默认使用 appsettings.json 来代替 app.config&#xff0c;并重新设计了一套完整的配置系统&#xff0c;可以支持 json/xml/ini/环境变量等。在 .net core 中有一个 GetConnectionStr…

使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由

路由机制会把一个请求的URI映射到一个Controller上面的Action&#xff0c;所以当你发送一个HTTP请求的时候&#xff0c;MVC框架会解析这个请求的URI&#xff0c;并尝试着把它映射到一个Controller上面的Action。两个路由中间件在ASP.NET Core 3.x里面&#xff0c;建议使用Endpo…

EFCore批量操作,你真的清楚吗

背景EntityFramework Core有许多新的特性&#xff0c;其中一个重要特性便是批量操作。批量操作意味着不需要为每次Insert/Update/Delete操作发送单独的命令&#xff0c;而是在一次SQL请求中发送批量组合指令。EFCore批量操作实践批处理是期待已久的功能&#xff0c;社区多次提出…

asp.net core 自定义 Policy 替换 AllowAnonymous 的行为

asp.net core 自定义 Policy 替换 AllowAnonymous 的行为Intro最近对我们的服务进行了改造&#xff0c;原本内部服务在内部可以匿名调用&#xff0c;现在增加了限制&#xff0c;通过 identity server 来管理 api 和 client&#xff0c;网关和需要访问api的客户端或api服务相互调…

前端小白在asp.net core mvc中使用ECharts

对于在浏览器中绘制图形图表&#xff0c;目前有较多的js类库可以使用&#xff0c;如&#xff1a;ChartJS&#xff0c;Flot&#xff0c;canvasjs等&#xff0c;但是今天介绍的主角为国产图表库&#xff0c;并在apache孵化&#xff0c;就是大名鼎鼎的echarts。前方高能【官方介绍…

超过1w的Github Star大佬和他们的公众号,太强了!

不少同学担忧的情况——“晋升无望、收入见顶、生活开支飙升、财务危机如影随形”&#xff0c;小编精心挑选了几个优质原创技术号&#xff0c;推荐给大家化解成长的烦恼。他们都是我平时关注的优秀号主&#xff0c;分享给大家&#xff0c;助大家学习路上披荆斩棘~Python爱好者社…

C# 结合 Golang 开发

1. 实现方式与语法形式基本方式&#xff1a;将 Go 程序编译成 DLL 供 C# 调用。1.1 Go代码注意&#xff1a;代码中 export 的注释是定义的入口描述不能省略package mainimport "C"import "fmt"func main() { fmt.Println(Test())}var _count 0//Test :…

Java和C++区别

Java和C的区别有很多&#xff0c;主要集中在如下几个方面&#xff1a; 运行机制 Java&#xff1a; 编写&#xff1a;是指在Java开发环境&#xff08;Eclipse、Sublime等&#xff09;中进行程序代码的输入&#xff0c;最终形成后缀名为.java的Java源文件。 编译&#xff1a;是指…

未雨绸缪 | 一文简介 Azure Front Door

点击上方蓝字关注“汪宇杰博客”导语昨天早晨微软服务器发生了核爆&#xff0c;Office 365&#xff0c;Bing&#xff0c;Azure DevOps全线完蛋。人类文明危在旦夕之际&#xff0c;微软美国的死士凌晨2点爬起来收福报&#xff0c;修好了服务器&#xff0c;拯救了全人类&#xff…

Linux下管理员权限获取(su和sudo的区别)

我们知道&#xff0c;在Linux下对很多文件进行修改都需要有root&#xff08;管理员&#xff09;权限&#xff0c;比如对/ect/profile等文件的修改。很多情况下&#xff0c;我们在进行开发的时候都是使用普通用户进行登录的&#xff0c;尤其在进行一些环境变量的配置工作时&…

左手专注,右手时间

大家好&#xff0c;我是Z哥。今天带来的是一篇有感而发的随笔&#xff0c;敬请品尝&#xff5e;前两天最火的事情莫过于WPS上市了。这个平时默默无闻、低调的可怕的产品一下子被捧上了天。我第一次接触到WPS还比较晚&#xff0c;大约在2014年的样子&#xff0c;当时由于某些特殊…