ASP.NET Core Web API 限制 IP重复请求以减少服务器负载

作者 : 慕源网 本文共3315个字,预计阅读时间需要9分钟 发布时间: 2021-12-6 共237人阅读

有几篇关于该主题的文章和博客描述了如何阻止或限制 IP 地址发出重复请求以减少服务器负载。

那么,为什么我们需要另一篇博客或文章添加到该列表中?是什么让这篇文章与众不同?

  1. 它使用Session 状态,这是当前 Asp.Net Core 3.1 中的最新项目,而不是将 IP 详细信息保存在数据库中。
  2. 它执行操作逻辑之外的所有操作,因此如果请求超过预定的请求计数,用户将被拒绝访问 API 的操作。
  3. 通过利用Session 状态和分布式内存概念,它会在这个过程中变得非常快。

这篇文章将介绍在 ASP.Net Core 中构建 API 时常用的几个关键方面。API 是一种将开发系统连接到第三方系统的接口。API 允许各种程序相互通信。另一方面,众所周知,单个应用程序目前使用 API 来管理前端和后端通信。总体而言,安全性是创建 API 时要考虑的最重要特征之一,因为没有人知道谁将使用它们或如何使用它们。

本文将介绍如何避免暴力攻击以及如何管理来自客户端的大量请求。我们还将研究 ASP.Net Core Web API 的几个关键方面,例如Session 状态和内置属性。本文将向初学者和中级人员展示如何保护 API 免受第三方恶意活动的侵害,并减少重复查询造成的服务器负载。

第 1 步:创建项目

首先,构建一个新项目或向现有项目添加功能以管理或处理 Web API 请求。使用最新版本的 .Net 框架创建一个项目。ASP.Net Core 3.1 是最新且稳定的版本。

步骤 2:添加和配置Session 服务

成功创建项目后,第一步是将Session 服务添加到 Startup.cs 文件中。因此,我们将能够将Session 状态包含到我们的应用程序中。我们的目标是在不依赖数据库的情况下检测客户端请求,这样我们的程序就不必每次都连接数据库。此外,我们将利用Session 状态存储,它将所有客户端请求保存在分布式内存中,使其速度非常快,并防止用户在特定时间段内有大量请求时进入程序。以下是我们需要包含在启动文件中的服务列表。

services.AddDistributedMemoryCache();
services.AddSession();

这两者都会通知系统将会话项在内存中保留很长时间。我们还可以处理具有各种设置的会话,例如超时、httponly 等。

现在,在 Startup.cs 文件中,将 SessionMiddleware 添加到配置部分。

app.UseSession();

UseSession 是一个中间件组件,它使系统能够在Session 状态下保存项目。

第 3 步:添加类以处理 IP 详细信息。

创建一个将处理和存储请求详细信息的类。我创建了一个名为“IPDetailModel”的类。这包括有关传入请求的基本信息。

public class IPDetailModel {
    public string IPAddress {
        get;
        set;
    }
    public DateTime Time {
        get;
        set;
    }
    public int Count {
        get;
        set;
    }
}

第 4 步:创建自定义属性类。

现在,在项目中,创建一个类来处理属性逻辑。我将我的类命名为“TraceIPAttribute”。创建类后,将 ActionFilterAttribute 分配给它。现在,在类中,添加一个“OnActionExecuting”方法。处理传入请求的逻辑如下所示,它确定请求是否应该通过 API 逻辑或是否必须绕过。

public class TraceIPAttribute: ActionFilterAttribute {
    IPDetailModel model = new IPDetailModel();
    public override void OnActionExecuting(ActionExecutingContext context) {
        var remoteIp = context.HttpContext.Connection.RemoteIpAddress.ToString();
        if (context.HttpContext.Session.GetString(remoteIp) == null) {
            model.Count = 1;
            model.IPAddress = remoteIp;
            model.Time = DateTime.Now;
            context.HttpContext.Session.SetString(remoteIp, JsonConvert.SerializeObject(model));
        } else {
            var _record = JsonConvert.DeserializeObject < IPDetailModel > (context.HttpContext.Session.GetString(remoteIp));
            if (DateTime.Now.Subtract(_record.Time).TotalMinutes < 1 && _record.Count > 1) {
                context.Result = new JsonResult("Permission denined!");
            } else {
                _record.Count = _record.Count + 1;
                context.HttpContext.Session.Remove(remoteIp);
                context.HttpContext.Session.SetString(remoteIp, JsonConvert.SerializeObject(_record));
            }
        }
    }
}

因此,正如您从代码片段中看到的,我创建了一个具有单个请求计数的一分钟时间段。因此,如果在一分钟内收到来自同一 IP 地址的两个或多个请求,逻辑将阻止用户访问 API 的操作。一分钟后,相同的 IP 地址可以访问 API。 

提供的代码将传入请求保存在 IPDetailModel 中,然后序列化和反序列化数据以从模态中获取它。我们可以使用 Newtonsoft.Json 包来序列化和反序列化数据。

创建自定义中间件类后,将其添加到 Startup.cs 文件的 ConfigureServices 部分。这将通知系统此中间件的存在。

public void ConfigureServices(IServiceCollection services) {
    services.AddControllers();
    services.AddDistributedMemoryCache();
    services.AddSession();
    services.AddScoped < TraceIPAttribute > ();
}

第五步:在控制器端添加自定义中间件。

在控制器端,添加 TraceIPAttribute。在调用控制器的操作之前,它会分析请求。

[ApiController]
[Route("[controller]")]
[ServiceFilter(typeof(TraceIPAttribute))]
public class WeatherForecastController: ControllerBase {
    //All actions and APIs will placed here.
}

我已将 TraceIPAttribute 添加到控制器中,因为它将应用于其下的所有操作。但是,如果我们想将它用于特定的动作,我们可能会将它分配给那些动作。

处理流程

当请求到达时,首先执行 TraceIPAttribute 逻辑。如果这是应用程序第一次收到请求,IPDetailModel 将记录 IP 地址、时间和请求计数,然后它会访问控制器的逻辑并返回响应。但是,如果同一个IP发送多个请求,它会先去TraceIPAttribute逻辑,如果请求来自同一个IP地址并且在给定的时间段内,它不会让请求通过控制器的动作,但是相反,将阻止请求向前移动,绕过来自控制器外部的请求。

结论

API 现在是在各种系统和应用程序之间交换数据的最常用方法。此外,暴力攻击、中间人攻击等安全攻击近来呈上升趋势。因此,本文将有助于使您的应用程序免受暴力尝试的侵害。此外,如果服务器收到大量请求,服务器的负载可能会变得非常高,从而导致应用程序宕机。因此,由于来自外部的大量请求,这种方法将有助于减少服务器上的负载。


慕源网 » ASP.NET Core Web API 限制 IP重复请求以减少服务器负载

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录