ASP.NET环境下为网站增加IP过滤功能
1. 需求分析
通过深入的交流和沟通,确认了该发电厂在企业网站用户访问控制方面的改进要求,大致情况如下:
a) 网站基于Asp.Net2.0实现,不允许修改源程序
b) 厂内用户可直接访问整个站点的所有页面,员工不需要身份验证
c) 厂外用户只能访问指定的页面
显而易见,他们就是针对企业网站增加一项IP过滤功能,在厂外用户访问某些敏感页面时将其拒之门外。首先我们需要设置一个IP列表和一个Url列表,前者包含所有厂内IP,后者包含厂外用户可访问的全部Url,并且这两个列表都是可维护的;另外一个核心问题是,我们需要选择一个合理的方式将开发好的功能模块集成到企业网站中,HttpModules义不容辞。
在Asp.Net时代,IIS 接收到请求并将其调度给 aspnet_isapi.dll之后,ASP.NET 引擎开始逐个对已配置的HTTP模块(HttpModules)进行初始化,然后再调用正确的HTTP处理程序并呈现被请求的资源,最后将所生成的标记返回给 IIS 和请求客户端(如下图所示)。
IIS 和 ASP.NET 正在处理请求
如果你想了解更多关于HttpModules的资料,请自行查阅。
2. 方案设计
2.1. 开发环境
编程语言:C#2.0
开发工具:Visual Studio.NET2008
操作系统:windows2003 R2
2.2. 概要设计
使用HttpModules实现IP过滤功能的核心思想是:自定义一个HttpModule捕获每一个用户请求,然后获取相关的用户IP和被请求的Url进行逻辑判断,将未授权的请求重定向到一个错误提示页。Http请求授权与否的判断逻辑为:
1) 判断请求是否来自本地计算机,是则自动忽略,否则继续;
2) 判断用户IP是否属于内网(IP列表),是则忽略,否则继续;
3) 判断被请求Url是否授权所有用户访问,是则忽略,否则继续;
4) 将请求重定向到错误提示页。
在HttpApplication的BeginRequest事件中附加自定义的处理程序即可完成Http请求的捕获。此外,为了便于维护我们应将程序运行需要的各项参数(IP列表、Url列表、错误提示页路径等等)存储于特定的XML配置文件中,为了提高效率,我们还需要将配置文件执行内存级的缓存处理并对IP、Url匹配算法进行适当的优化。