熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

在.NET環境下為網站增加IP過濾功能

2013-11-13 10:33:09  來源: .NET編程 

  摘要華能集團下某發電廠的企業網站(基於AspNet實現不允許修改源程序)要求實現廠內用戶可直接訪問整個站點的所有頁面廠外用戶只能訪問指定的頁面的功能本文將按照需求分析方案設計編碼實現部署應用的順序逐步闡述整個解決方案的形成過程

      需求分析
通過深入的交流和溝通確認了該發電廠在企業網站用戶訪問控制方面的改進要求大致情況如下
a)    網站基於AspNet實現不允許修改源程序
b)    廠內用戶可直接訪問整個站點的所有頁面員工不需要身份驗證
c)    廠外用戶只能訪問指定的頁面
 

  顯而易見他們就是針對企業網站增加一項IP過濾功能在廠外用戶訪問某些敏感頁面時將其拒之門外首先我們需要設置一個IP列表和一個Url列表前者包含所有廠內IP後者包含廠外用戶可訪問的全部Url並且這兩個列表都是可維護的另外一個核心問題是我們需要選擇一個合理的方式將開發好的功能模塊集成到企業網站中HttpModules義不容辭

  在AspNet時代IIS 接收到請求並將其調度給 aspnet_isapidll之後ASPNET 引擎開始逐個對已配置的HTTP模塊(HttpModules)進行初始化然後再調用正確的HTTP處理程序並呈現被請求的資源最後將所生成的標記返回給 IIS 和請求客戶端(如下圖所示)

  IIS 和 ASPNET 正在處理請求
如果你想了解更多關於HttpModules的資料請自行查閱

      方案設計
    開發環境
編程語言C#
開發工具Visual StudioNET
操作系統windows R

      概要設計
使用HttpModules實現IP過濾功能的核心思想是自定義一個HttpModule捕獲每一個用戶請求然後獲取相關的用戶IP和被請求的Url進行邏輯判斷將未授權的請求重定向到一個錯誤提示頁Http請求授權與否的判斷邏輯為
)    判斷請求是否來自本地計算機是則自動忽略否則繼續
)    判斷用戶IP是否屬於內網(IP列表)是則忽略否則繼續
)    判斷被請求Url是否授權所有用戶訪問是則忽略否則繼續
)    將請求重定向到錯誤提示頁

  
在HttpApplication的BeginRequest事件中附加自定義的處理程序即可完成Http請求的捕獲此外為了便於維護我們應將程序運行需要的各項參數(IP列表Url列表錯誤提示頁路徑等等)存儲於特定的XML配置文件中為了提高效率我們還需要將配置文件執行內存級的緩存處理並對IPUrl匹配算法進行適當的優化

      配置緩存算法
配置文件的緩存參照微軟CommonServer項目中的實現邏輯將配置信息持久化為實體類存儲於HttpContextCurrentCache中配置文件發生後緩存信息將自動清空下次訪問時再次執行持久化操作

  不需重啟站點本文對CommonServer的緩存邏輯不做深入探討感興趣者可自行搜索相關資料

      IP列表算法
通過上文可知當前項目用到的IP列表包含的數據量非常有限就是電廠web服務器可有效識別的內網IP的窮舉

  因而我們將整個IP列表緩存使用時直接檢索當前用戶IP是否存在於列表之中即可在具體IP的存儲方面我們可將其視作進制將IP字符串轉換為數字格式(例如可視作***+**+*+=不考慮IPV在參數配置的格式方面我們應同時支持單個IP或IP段的方式增刪IP列表

      Url列表算法
就具體需求而言Url列表是一個授權外網用戶訪問的白名單換個說法對外網用戶而言除了在列表之中的其他都不可訪問一旦數據的安全級別降低會不會出現對外網用戶而言除了列表之中的其他都可以訪問的情況出現呢?為了兼容這種後續場景我們需要為Url列表定義一個是否黑名單(IsBlacklist)的附加參數另外對於動態網站窮舉Url顯然是不現實的不管是維護黑名單還是白名單所以我們可以轉變一下思路更改最終Url為正則表達式維護一個可匹配目標Url的正則表達式列表針對用戶請求的具體Url逐個正則表達式執行匹配操作只要有一個匹配成功則認為當前Url存在於Url列表之中

      編碼實現
由於本文提供全部的c#源碼下載所以本節僅對源碼壓縮包中的主要文件進行簡要說明
 

  DotCommonWebsiteFilter
│  DotCommonWebsiteFiltercfgxml
│  WebsiteFilterConfigurationcs
│  WebsiteFilterHttpModulecs
├─Util
│      GlobesCachecs
│      XmlAttributeReadercs
└─WebsiteFilter
        IPMatchEnginecs
        UrlMatchConditioncs
        UrlMatchEnginecs
 

  ?    DotCommonWebsiteFiltercfgxml
運行參數配置文件
?    WebsiteFilterConfigurationcs
配置文件實體類
?    WebsiteFilterHttpModulecs
實現了SystemWebIHttpModule接口的自定義Http模塊
?    GlobesCachecs
全局緩存操控類
?    XmlAttributeReadercs
xml節點屬性讀取器
?    IPMatchEnginecs
IP匹配引擎
?    UrlMatchConditioncs
Url匹配條件(與正則表達式匹配)
?    UrlMatchEnginecs
Url匹配引擎
 WebsiteFilterHttpModulecs中BeginRequest自定義處理程序的核心代碼如下
 

  void context_BeginRequest(object sender EventArgs e)
        {
            if (HttpContextCurrentRequestIsLocal)//忽略本地計算機請求
                return;
            string ip = HttpContextCurrentRequestUserHostAddress;
            if (!WebsiteFilterConfigurationGetConfig()PickedIPsIsMatch(ip))
            {   //若在IP列表中找不到訪客ip               
                string rawUrl = HttpContextCurrentRequestRawUrl;
                UrlMatchEngine pu = WebsiteFilterConfigurationGetConfig()PickedUrls;
                //列表包含當前url且列表為黑名單列表不包含當前url且列表不為黑名單  時需轉向
                //換而言之配備結果是否黑名單取值一致時需轉向
                if (puIsMatch(rawUrl) == puIsBlacklist)
                {   //非公開url自動重定向
                    HttpContextCurrentResponseRedirect(puErrorPage);
                }
            }
     }

      部署應用
    DotCommonWebsiteFiltercfgxml配置文件

  配置文件的根節點為DotCommon所有配置信息均為WebsiteFilter節點的子項PickedUrl節點對應Url列表IsBlacklist(否)指示是否為黑名單ErrorPage指定錯誤提示頁路徑其子節點add可重復出現

  通過pattern屬性指定正則表達式文本上圖所示配置表示僅網站首頁(defaultaspx)允許外網用戶訪問

  PickedIP節點對應IP列表有效子節點包括addremoveclear三項以上圖為例第一個add指示內網ip為五個到第二行刪除掉還剩兩個到第三行再添加上最終的內網IP列表為三個

      在企業網站中集成
配置好DotCommonWebsiteFiltercfgxml中的各項參數並拷貝到網站根目錄
拷貝DotCommonWebsiteFilterdll文件到網站bin目錄
在網站根目錄下建立與配置文件中相對應的錯誤提示頁(例如)
修改nfig在<httpModules>節點下注冊WebsiteFilter模塊代碼如下

  <httpModules>
   <add name=WebsiteFilter
      type=DotCommonWebsiteFilterHttpModule DotCommonWebsiteFilter/>
</httpModules>
分別從內網外網訪問企業網站查看運行效果
結束語

  本文僅針對具體需求闡述解決方案的構思過程希望對讀者能有所幫助歡迎提出改進意見


From:http://tw.wingwit.com/Article/program/net/201311/13977.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.