如何在.NET環(huán)境下為網(wǎng)站增加IP過濾功能_.Net教程
推薦:淺談使用ASP.NET Global.asax 文件Global.asax文件,有時候叫做ASP.NET應(yīng)用程序文件,提供了一種在一個中心位置響應(yīng)應(yīng)用程序級或模塊級事件的方法。你可以使用這個文件實現(xiàn)應(yīng)用程序安全性以及其它一些任務(wù)。下面讓我們詳細(xì)看一下如何在應(yīng)用程序開發(fā)工作中使用這個文件。 概述 Global.asax位于
華能集團下某發(fā)電廠的企業(yè)網(wǎng)站(基于Asp.Net2.0實現(xiàn),不允許修改源程序)要求實現(xiàn)“廠內(nèi)用戶可直接訪問整個站點的所有頁面,廠外用戶只能訪問指定的頁面”的功能,本文將按照需求分析、方案設(shè)計、編碼實現(xiàn)、部署應(yīng)用的順序逐步闡述整個解決方案的形成過程。
1. 需求分析
通過深入的交流和溝通,確認(rèn)了該發(fā)電廠在企業(yè)網(wǎng)站用戶訪問控制方面的改進(jìn)要求,大致情況如下:
a) 網(wǎng)站基于Asp.Net2.0實現(xiàn),不允許修改源程序
b) 廠內(nèi)用戶可直接訪問整個站點的所有頁面,員工不需要身份驗證
c) 廠外用戶只能訪問指定的頁面
顯而易見,他們就是針對企業(yè)網(wǎng)站增加一項IP過濾功能,在廠外用戶訪問某些敏感頁面時將其拒之門外。首先我們需要設(shè)置一個IP列表和一個Url列表,前者包含所有廠內(nèi)IP,后者包含廠外用戶可訪問的全部Url,并且這兩個列表都是可維護的;另外一個核心問題是,我們需要選擇一個合理的方式將開發(fā)好的功能模塊集成到企業(yè)網(wǎng)站中,HttpModules義不容辭。
在Asp.Net時代,IIS 接收到請求并將其調(diào)度給 aspnet_isapi.dll之后,ASP.NET 引擎開始逐個對已配置的HTTP模塊(HttpModules)進(jìn)行初始化,然后再調(diào)用正確的HTTP處理程序并呈現(xiàn)被請求的資源,最后將所生成的標(biāo)記返回給 IIS 和請求客戶端(如下圖所示)。

IIS 和 ASP.NET 正在處理請求
如果你想了解更多關(guān)于HttpModules的資料,請自行查閱。
2. 方案設(shè)計
2.1. 開發(fā)環(huán)境
編程語言:C#2.0
開發(fā)工具:Visual Studio.NET2008
操作系統(tǒng):windows2003 R2
2.2. 概要設(shè)計
使用HttpModules實現(xiàn)IP過濾功能的核心思想是:自定義一個HttpModule捕獲每一個用戶請求,然后獲取相關(guān)的用戶IP和被請求的Url進(jìn)行邏輯判斷,將未授權(quán)的請求重定向到一個錯誤提示頁。Http請求授權(quán)與否的判斷邏輯為:
1) 判斷請求是否來自本地計算機,是則自動忽略,否則繼續(xù);
2) 判斷用戶IP是否屬于內(nèi)網(wǎng)(IP列表),是則忽略,否則繼續(xù);
3) 判斷被請求Url是否授權(quán)所有用戶訪問,是則忽略,否則繼續(xù);
4) 將請求重定向到錯誤提示頁。

在HttpApplication的BeginRequest事件中附加自定義的處理程序即可完成Http請求的捕獲。此外,為了便于維護我們應(yīng)將程序運行需要的各項參數(shù)(IP列表、Url列表、錯誤提示頁路徑等等)存儲于特定的XML配置文件中,為了提高效率,我們還需要將配置文件執(zhí)行內(nèi)存級的緩存處理并對IP、Url匹配算法進(jìn)行適當(dāng)?shù)膬?yōu)化。
2.3. 配置緩存算法
配置文件的緩存參照微軟CommonServer項目中的實現(xiàn)邏輯,將配置信息持久化為實體類存儲于HttpContext.Current.Cache中,配置文件發(fā)生后緩存信息將自動清空,下次訪問時再次執(zhí)行持久化操作,不需重啟站點。本文對CommonServer的緩存邏輯不做深入探討,感興趣者可自行搜索相關(guān)資料。
2.4. IP列表算法
通過上文可知,當(dāng)前項目用到的IP列表包含的數(shù)據(jù)量非常有限,就是電廠web服務(wù)器可有效識別的內(nèi)網(wǎng)IP的窮舉。
因而我們將整個IP列表緩存,使用時直接檢索當(dāng)前用戶IP是否存在于列表之中即可。在具體IP的存儲方面,我們可將其視作256進(jìn)制,將IP字符串轉(zhuǎn)換為數(shù)字格式(例如:192.168.10.3可視作192*256*256*256+168*256*256+10*256+3=3232238083,不考慮IPV6);在參數(shù)配置的格式方面,我們應(yīng)同時支持單個IP或IP段的方式增刪IP列表。
2.5. Url列表算法
就具體需求而言,Url列表是一個授權(quán)外網(wǎng)用戶訪問的白名單,換個說法,“對外網(wǎng)用戶而言除了在列表之中的其他都不可訪問”,一旦數(shù)據(jù)的安全級別降低,會不會出現(xiàn)“對外網(wǎng)用戶而言除了列表之中的其他都可以訪問”的情況出現(xiàn)呢?為了兼容這種后續(xù)場景,我們需要為Url列表定義一個“是否黑名單”(IsBlacklist)的附加參數(shù);另外,對于動態(tài)網(wǎng)站窮舉Url顯然是不現(xiàn)實的,不管是維護黑名單還是白名單,所以我們可以轉(zhuǎn)變一下思路,更改最終Url為正則表達(dá)式,即:維護一個可匹配目標(biāo)Url的正則表達(dá)式列表,針對用戶請求的具體Url逐個正則表達(dá)式執(zhí)行匹配操作,只要有一個匹配成功則認(rèn)為當(dāng)前Url存在于Url列表之中。
3. 編碼實現(xiàn)
由于本文提供全部的c#源碼下載,所以本節(jié)僅對源碼壓縮包中的主要文件進(jìn)行簡要說明:
| 以下為引用的內(nèi)容: DotCommon.WebsiteFilter │ DotCommonWebsiteFilter.cfg.xml │ WebsiteFilterConfiguration.cs │ WebsiteFilterHttpModule.cs ├─Util │ GlobesCache.cs │ XmlAttributeReader.cs └─WebsiteFilter IPMatchEngine.cs UrlMatchCondition.cs UrlMatchEngine.cs |
DotCommonWebsiteFilter.cfg.xml
運行參數(shù)配置文件
WebsiteFilterConfiguration.cs
配置文件實體類
WebsiteFilterHttpModule.cs
實現(xiàn)了System.Web.IHttpModule接口的自定義Http模塊
GlobesCache.cs
全局緩存操控類
XmlAttributeReader.cs
xml節(jié)點屬性讀取器
IPMatchEngine.cs
IP匹配引擎
UrlMatchCondition.cs
Url匹配條件(與正則表達(dá)式匹配)
UrlMatchEngine.cs
Url匹配引擎
WebsiteFilterHttpModule.cs中BeginRequest自定義處理程序的核心代碼如下:
| 以下為引用的內(nèi)容: 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; //列表包含當(dāng)前url且列表為黑名單、列表不包含當(dāng)前url且列表不為黑名單 時需轉(zhuǎn)向 //換而言之,“配備結(jié)果”與“是否黑名單”取值一致時需轉(zhuǎn)向 if (pu.IsMatch(rawUrl) == pu.IsBlacklist) { //非公開url自動重定向 HttpContext.Current.Response.Redirect(pu.ErrorPage); } } } |
4. 部署應(yīng)用
4.1. DotCommonWebsiteFilter.cfg.xml配置文件

配置文件的根節(jié)點為DotCommon,所有配置信息均為WebsiteFilter節(jié)點的子項。PickedUrl節(jié)點對應(yīng)Url列表,IsBlacklist(1是0否)指示是否為黑名單,ErrorPage指定錯誤提示頁路徑,其子節(jié)點add可重復(fù)出現(xiàn),通過pattern屬性指定正則表達(dá)式文本,上圖所示配置表示僅網(wǎng)站首頁(default.aspx)允許外網(wǎng)用戶訪問。
PickedIP節(jié)點對應(yīng)IP列表,有效子節(jié)點包括add、remove、clear三項。以上圖為例,第一個add指示內(nèi)網(wǎng)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,最終的內(nèi)網(wǎng)IP列表為192.168.10.1、192.168.10.3、192.168.10.5三個。
4.2. 在企業(yè)網(wǎng)站中集成
配置好DotCommonWebsiteFilter.cfg.xml中的各項參數(shù)并拷貝到網(wǎng)站根目錄。
拷貝DotCommon.WebsiteFilter.dll文件到網(wǎng)站bin目錄。
在網(wǎng)站根目錄下建立與配置文件中相對應(yīng)的錯誤提示頁(例如sorry.htm)。
修改Web.config在《httpModules》節(jié)點下注冊WebsiteFilter模塊,代碼如下:
| 以下為引用的內(nèi)容: <httpModules> <add name="WebsiteFilter" type="DotCommon.WebsiteFilterHttpModule, DotCommon.WebsiteFilter"/> </httpModules> |
分別從內(nèi)網(wǎng)、外網(wǎng)訪問企業(yè)網(wǎng)站查看運行效果。
結(jié)束語
本文僅針對具體需求闡述解決方案的構(gòu)思過程,希望對讀者能有所幫助,歡迎提出改進(jìn)意見。
分享:解讀Java與.NET間進(jìn)行Web Service交互的選擇談到.NET和Java之間的Web服務(wù)交互性時,通常的選擇只有SOAP over HTTP,而根據(jù).NET 3.0的相關(guān)規(guī)范,這僅有的一個選擇也將會受到更多限制,.NET中提供的BasicHTTP將是唯一能直接與Java Web Servcies進(jìn)行交互的方式。 最近,有兩個新的選擇出現(xiàn)了
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-如何在.NET環(huán)境下為網(wǎng)站增加IP過濾功能
。