IIS中按URL的请求速率限制

问题描述 投票:0回答:1

在我的应用程序中,我希望将请求限制为要由服务器处理的网站登录页面,如果请求增加了特定数量,则IIS应该在一段时间内阻止该IP地址。我已经通过IIS的“ IP地址和域限制”功能,但是如果请求来自登录页面而不是网站上其他页面和操作的请求,我想阻止该请求。我们如何使用IIS实现这一目标?

.net iis iis-8
1个回答
0
投票
IIS IP限制只能用于站点级别。您不能为特定控制器或文件夹设置动态IP限制。因此,建议改用自定义httpmodule。您可以在此代码中添加一个过滤器,以使httpmodule仅在您的登录页面上验证点击数。

CS1

public class UrlReWrite : IHttpModule { private int rowCount = Convert.ToInt32(ConfigurationManager.AppSettings["HttpRowCount"]); private int httpTime = Convert.ToInt32(ConfigurationManager.AppSettings["HttpTime"]); public void Init(HttpApplication application) { application.BeginRequest += (new EventHandler(this.Application_BeginRequest)); application.EndRequest += (new EventHandler(this.Application_EndRequest)); } private void Application_BeginRequest(Object source, EventArgs e) { HttpApplication Application = (HttpApplication)source; HttpContext ctx = Application.Context; string isIp = ctx.Request.UserHostAddress; if (ctx.Application["time"] == null) { ctx.Application["time"] = DateTime.Now; } else { DateTime isTime = (DateTime)ctx.Application["time"]; int timeTract = Convert.ToInt32(DateTime.Now.Subtract(isTime).Minutes.ToString()); if (timeTract > (httpTime - 1)) { ctx.Application["time"] = null; ctx.Application["myip"] = null; } } if (ctx.Application["myip"] != null && ctx.Application["myip"] is CartIp) { CartIp cartIp = (CartIp)ctx.Application["myip"]; cartIp.Insert(isIp); ctx.Application["myip"] = cartIp; if (cartIp.GetCount(isIp) > rowCount) { ctx.Response.Clear(); ctx.Response.Close(); } } else { CartIp cartIp = new CartIp(); cartIp.Insert(isIp); HttpContext.Current.Application["myip"] = cartIp; } } private void Application_EndRequest(Object source, EventArgs e) { } public void Dispose() { } } }

class2.cs

[Serializable] public class ListIp { private string ip; private int count; public string IP { get { return ip; } set { ip = value; } } public int Count { get { return count; } set { count = value; } } } [Serializable] public class CartIp { public CartIp() { if (_listIp == null) { _listIp = new List<ListIp>(); } } private List<ListIp> _listIp; public List<ListIp> _ListIp { get { return _listIp; } set { _listIp = value; } } public void Insert(string ip) { int indexof = ItemLastInfo(ip); if (indexof == -1) { ListIp item = new ListIp(); item.IP = ip; _listIp.Add(item); } else { _listIp[indexof].Count += 1; } } public int ItemLastInfo(string ip) { int index = 0; foreach (ListIp item in _ListIp) { if (item.IP == ip) { return index; } index += 1; } return -1; } /// <summary> /// get number of IP address /// </summary> /// <param name="ip"></param> /// <returns></returns> public int GetCount(string ip) { foreach (ListIp item in _ListIp) { if (item.IP == ip) { return item.Count; } } return -1; } }

web.config

<appSettings> <add key="HttpRowCount" value="100"/> <add key="HttpTime" value="10"/> </appSettings>

您只需要创建一个类库。然后复制并修改这些代码以实现您的要求。最后,您需要将发行版dll复制到bin文件夹,然后通过IIS管理器->站点节点->模块->添加托管模块将其导入。

https://www.cnblogs.com/Fooo/archive/2013/01/27/2878820.html

© www.soinside.com 2019 - 2024. All rights reserved.