ASP.NET环境下为网站增加IP过滤功能第2/2页
2.3. 配置缓存算法
配置文件的缓存参照微软CommonServer项目中的实现逻辑,将配置信息持久化为实体类存储于HttpContext.Current.Cache中,配置文件发生后缓存信息将自动清空,下次访问时再次执行持久化操作,不需重启站点。本文对CommonServer的缓存逻辑不做深入探讨,感兴趣者可自行搜索相关资料。
2.4. IP列表算法
通过上文可知,当前项目用到的IP列表包含的数据量非常有限,就是电厂web服务器可有效识别的内网IP的穷举。
因而我们将整个IP列表缓存,使用时直接检索当前用户IP是否存在于列表之中即可。在具体IP的存储方面,我们可将其视作256进制,将IP字符串转换为数字格式(例如:192.168.10.3可视作192*256*256*256+168*256*256+10*256+3=3232238083,不考虑IPV6);在参数配置的格式方面,我们应同时支持单个IP或IP段的方式增删IP列表。
2.5. Url列表算法
就具体需求而言,Url列表是一个授权外网用户访问的白名单,换个说法,“对外网用户而言除了在列表之中的其他都不可访问”,一旦数据的安全级别降低,会不会出现“对外网用户而言除了列表之中的其他都可以访问”的情况出现呢?为了兼容这种后续场景,我们需要为Url列表定义一个“是否黑名单”(IsBlacklist)的附加参数;另外,对于动态网站穷举Url显然是不现实的,不管是维护黑名单还是白名单,所以我们可以转变一下思路,更改最终Url为正则表达式,即:维护一个可匹配目标Url的正则表达式列表,针对用户请求的具体Url逐个正则表达式执行匹配操作,只要有一个匹配成功则认为当前Url存在于Url列表之中。
3. 编码实现
由于本文提供全部的c#源码下载,所以本节仅对源码压缩包中的主要文件进行简要说明:
| 以下为引用的内容: DotCommon.WebsiteFilter │ DotCommonWebsiteFilter.cfg.xml │ WebsiteFilterConfiguration.cs │ WebsiteFilterHttpModule.cs ├─Util │ GlobesCache.cs │ XmlAttributeReader.cs └─WebsiteFilter IPMatchEngine.cs UrlMatchCondition.cs UrlMatchEngine.cs |
DotCommonWebsiteFilter.cfg.xml
运行参数配置文件
WebsiteFilterConfiguration.cs
配置文件实体类
WebsiteFilterHttpModule.cs
实现了System.Web.IHttpModule接口的自定义Http模块
GlobesCache.cs
全局缓存操控类
XmlAttributeReader.cs
xml节点属性读取器
IPMatchEngine.cs
IP匹配引擎
UrlMatchCondition.cs
Url匹配条件(与正则表达式匹配)
UrlMatchEngine.cs
Url匹配引擎
WebsiteFilterHttpModule.cs中BeginRequest自定义处理程序的核心代码如下:
| 以下为引用的内容: void context_BeginRequest(object sender, EventArgs e) { if (HttpContext.Current.Request.IsLocal)//忽略本地计算机请求 return; string ip = HttpContext.Current.Request.UserHostAddress; if (!WebsiteFilterConfiguration.GetConfig().PickedIPs.IsMatch(ip)) { //若在IP列表中找不到访客ip string rawUrl = HttpContext.Current.Request.RawUrl; UrlMatchEngine pu = WebsiteFilterConfiguration.GetConfig().PickedUrls; //列表包含当前url且列表为黑名单、列表不包含当前url且列表不为黑名单 时需转向 //换而言之,“配备结果”与“是否黑名单”取值一致时需转向 if (pu.IsMatch(rawUrl) == pu.IsBlacklist) { //非公开url自动重定向 HttpContext.Current.Response.Redirect(pu.ErrorPage); } } } |
4. 部署应用
4.1. DotCommonWebsiteFilter.cfg.xml配置文件

配置文件的根节点为DotCommon,所有配置信息均为WebsiteFilter节点的子项。PickedUrl节点对应Url列表,IsBlacklist(1是0否)指示是否为黑名单,ErrorPage指定错误提示页路径,其子节点add可重复出现,通过pattern属性指定正则表达式文本,上图所示配置表示仅网站首页(default.aspx)允许外网用户访问。
PickedIP节点对应IP列表,有效子节点包括add、remove、clear三项。以上图为例,第一个add指示内网ip为192.168.10.1、192.168.10.2、192.168.10.3、192.168.10.4、192.168.10.5五个;到第二行删除掉192.168.10.2、192.168.10.3、192.168.10.4还剩192.168.10.1、192.168.10.5两个;到第三行再添加上192.168.10.3,最终的内网IP列表为192.168.10.1、192.168.10.3、192.168.10.5三个。
4.2. 在企业网站中集成
配置好DotCommonWebsiteFilter.cfg.xml中的各项参数并拷贝到网站根目录。
拷贝DotCommon.WebsiteFilter.dll文件到网站bin目录。
在网站根目录下建立与配置文件中相对应的错误提示页(例如sorry.htm)。
修改Web.config在《httpModules》节点下注册WebsiteFilter模块,代码如下:
| 以下为引用的内容: <httpModules> <add name="WebsiteFilter" type="DotCommon.WebsiteFilterHttpModule, DotCommon.WebsiteFilter"/> </httpModules> |
分别从内网、外网访问企业网站查看运行效果。
相关文章
.NET Core使用Autofac容器的DI依赖注入,IOC控制反转及AOP切面编程
本文详细讲解了.NET Core使用Autofac容器的DI依赖注入,IOC控制反转及AOP切面编程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-02-02
ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码
管理系统退出登陆后,将网址重新输入后还会看到用户登陆后的界面,为了解决这个问题,我采用了以下方法,需要的朋友可以参考下2012-05-05


最新评论