日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

如何在.NET環(huán)境下為網(wǎng)站增加IP過(guò)濾功能_.Net教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:淺談使用ASP.NET Global.asax 文件
Global.asax文件,有時(shí)候叫做ASP.NET應(yīng)用程序文件,提供了一種在一個(gè)中心位置響應(yīng)應(yīng)用程序級(jí)或模塊級(jí)事件的方法。你可以使用這個(gè)文件實(shí)現(xiàn)應(yīng)用程序安全性以及其它一些任務(wù)。下面讓我們?cè)敿?xì)看一下如何在應(yīng)用程序開(kāi)發(fā)工作中使用這個(gè)文件。 概述 Global.asax位于

華能集團(tuán)下某發(fā)電廠的企業(yè)網(wǎng)站(基于Asp.Net2.0實(shí)現(xiàn),不允許修改源程序)要求實(shí)現(xiàn)“廠內(nèi)用戶可直接訪問(wèn)整個(gè)站點(diǎn)的所有頁(yè)面,廠外用戶只能訪問(wèn)指定的頁(yè)面”的功能,本文將按照需求分析、方案設(shè)計(jì)、編碼實(shí)現(xiàn)、部署應(yīng)用的順序逐步闡述整個(gè)解決方案的形成過(guò)程。

1. 需求分析

通過(guò)深入的交流和溝通,確認(rèn)了該發(fā)電廠在企業(yè)網(wǎng)站用戶訪問(wèn)控制方面的改進(jìn)要求,大致情況如下:

a) 網(wǎng)站基于Asp.Net2.0實(shí)現(xiàn),不允許修改源程序

b) 廠內(nèi)用戶可直接訪問(wèn)整個(gè)站點(diǎn)的所有頁(yè)面,員工不需要身份驗(yàn)證

c) 廠外用戶只能訪問(wèn)指定的頁(yè)面

顯而易見(jiàn),他們就是針對(duì)企業(yè)網(wǎng)站增加一項(xiàng)IP過(guò)濾功能,在廠外用戶訪問(wèn)某些敏感頁(yè)面時(shí)將其拒之門(mén)外。首先我們需要設(shè)置一個(gè)IP列表和一個(gè)Url列表,前者包含所有廠內(nèi)IP,后者包含廠外用戶可訪問(wèn)的全部Url,并且這兩個(gè)列表都是可維護(hù)的;另外一個(gè)核心問(wèn)題是,我們需要選擇一個(gè)合理的方式將開(kāi)發(fā)好的功能模塊集成到企業(yè)網(wǎng)站中,HttpModules義不容辭。

在Asp.Net時(shí)代,IIS 接收到請(qǐng)求并將其調(diào)度給 aspnet_isapi.dll之后,ASP.NET 引擎開(kāi)始逐個(gè)對(duì)已配置的HTTP模塊(HttpModules)進(jìn)行初始化,然后再調(diào)用正確的HTTP處理程序并呈現(xiàn)被請(qǐng)求的資源,最后將所生成的標(biāo)記返回給 IIS 和請(qǐng)求客戶端(如下圖所示)。

IIS 和 ASP.NET 正在處理請(qǐng)求

如果你想了解更多關(guān)于HttpModules的資料,請(qǐng)自行查閱。

2. 方案設(shè)計(jì)

2.1. 開(kāi)發(fā)環(huán)境

編程語(yǔ)言:C#2.0

開(kāi)發(fā)工具:Visual Studio.NET2008

操作系統(tǒng):windows2003 R2

2.2. 概要設(shè)計(jì)

使用HttpModules實(shí)現(xiàn)IP過(guò)濾功能的核心思想是:自定義一個(gè)HttpModule捕獲每一個(gè)用戶請(qǐng)求,然后獲取相關(guān)的用戶IP和被請(qǐng)求的Url進(jìn)行邏輯判斷,將未授權(quán)的請(qǐng)求重定向到一個(gè)錯(cuò)誤提示頁(yè)。Http請(qǐng)求授權(quán)與否的判斷邏輯為:

1) 判斷請(qǐng)求是否來(lái)自本地計(jì)算機(jī),是則自動(dòng)忽略,否則繼續(xù);

2) 判斷用戶IP是否屬于內(nèi)網(wǎng)(IP列表),是則忽略,否則繼續(xù);

3) 判斷被請(qǐng)求Url是否授權(quán)所有用戶訪問(wèn),是則忽略,否則繼續(xù);

4) 將請(qǐng)求重定向到錯(cuò)誤提示頁(yè)。

在HttpApplication的BeginRequest事件中附加自定義的處理程序即可完成Http請(qǐng)求的捕獲。此外,為了便于維護(hù)我們應(yīng)將程序運(yùn)行需要的各項(xiàng)參數(shù)(IP列表、Url列表、錯(cuò)誤提示頁(yè)路徑等等)存儲(chǔ)于特定的XML配置文件中,為了提高效率,我們還需要將配置文件執(zhí)行內(nèi)存級(jí)的緩存處理并對(duì)IP、Url匹配算法進(jìn)行適當(dāng)?shù)膬?yōu)化。

2.3. 配置緩存算法

配置文件的緩存參照微軟CommonServer項(xiàng)目中的實(shí)現(xiàn)邏輯,將配置信息持久化為實(shí)體類存儲(chǔ)于HttpContext.Current.Cache中,配置文件發(fā)生后緩存信息將自動(dòng)清空,下次訪問(wèn)時(shí)再次執(zhí)行持久化操作,不需重啟站點(diǎn)。本文對(duì)CommonServer的緩存邏輯不做深入探討,感興趣者可自行搜索相關(guān)資料。

2.4. IP列表算法

通過(guò)上文可知,當(dāng)前項(xiàng)目用到的IP列表包含的數(shù)據(jù)量非常有限,就是電廠web服務(wù)器可有效識(shí)別的內(nèi)網(wǎng)IP的窮舉。

因而我們將整個(gè)IP列表緩存,使用時(shí)直接檢索當(dāng)前用戶IP是否存在于列表之中即可。在具體IP的存儲(chǔ)方面,我們可將其視作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)同時(shí)支持單個(gè)IP或IP段的方式增刪IP列表。

2.5. Url列表算法

就具體需求而言,Url列表是一個(gè)授權(quán)外網(wǎng)用戶訪問(wèn)的白名單,換個(gè)說(shuō)法,“對(duì)外網(wǎng)用戶而言除了在列表之中的其他都不可訪問(wèn)”,一旦數(shù)據(jù)的安全級(jí)別降低,會(huì)不會(huì)出現(xiàn)“對(duì)外網(wǎng)用戶而言除了列表之中的其他都可以訪問(wèn)”的情況出現(xiàn)呢?為了兼容這種后續(xù)場(chǎng)景,我們需要為Url列表定義一個(gè)“是否黑名單”(IsBlacklist)的附加參數(shù);另外,對(duì)于動(dòng)態(tài)網(wǎng)站窮舉Url顯然是不現(xiàn)實(shí)的,不管是維護(hù)黑名單還是白名單,所以我們可以轉(zhuǎn)變一下思路,更改最終Url為正則表達(dá)式,即:維護(hù)一個(gè)可匹配目標(biāo)Url的正則表達(dá)式列表,針對(duì)用戶請(qǐng)求的具體Url逐個(gè)正則表達(dá)式執(zhí)行匹配操作,只要有一個(gè)匹配成功則認(rèn)為當(dāng)前Url存在于Url列表之中。

3. 編碼實(shí)現(xiàn)

由于本文提供全部的c#源碼下載,所以本節(jié)僅對(duì)源碼壓縮包中的主要文件進(jìn)行簡(jiǎn)要說(shuō)明:

以下為引用的內(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

運(yùn)行參數(shù)配置文件

WebsiteFilterConfiguration.cs

配置文件實(shí)體類

WebsiteFilterHttpModule.cs

實(shí)現(xiàn)了System.Web.IHttpModule接口的自定義Http模塊

GlobesCache.cs

全局緩存操控類

XmlAttributeReader.cs

xml節(jié)點(diǎn)屬性讀取器

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)//忽略本地計(jì)算機(jī)請(qǐng)求
                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且列表不為黑名單  時(shí)需轉(zhuǎn)向
                
//換而言之,“配備結(jié)果”與“是否黑名單”取值一致時(shí)需轉(zhuǎn)向
                if (pu.IsMatch(rawUrl) == pu.IsBlacklist)
                {   
//非公開(kāi)url自動(dòng)重定向
                    HttpContext.Current.Response.Redirect(pu.ErrorPage);
                }
            } 
     }

4. 部署應(yīng)用

4.1. DotCommonWebsiteFilter.cfg.xml配置文件

配置文件的根節(jié)點(diǎn)為DotCommon,所有配置信息均為WebsiteFilter節(jié)點(diǎn)的子項(xiàng)。PickedUrl節(jié)點(diǎn)對(duì)應(yīng)Url列表,IsBlacklist(1是0否)指示是否為黑名單,ErrorPage指定錯(cuò)誤提示頁(yè)路徑,其子節(jié)點(diǎn)add可重復(fù)出現(xiàn),通過(guò)pattern屬性指定正則表達(dá)式文本,上圖所示配置表示僅網(wǎng)站首頁(yè)(default.aspx)允許外網(wǎng)用戶訪問(wèn)。

PickedIP節(jié)點(diǎn)對(duì)應(yīng)IP列表,有效子節(jié)點(diǎn)包括add、remove、clear三項(xiàng)。以上圖為例,第一個(gè)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五個(gè);到第二行刪除掉192.168.10.2、192.168.10.3、192.168.10.4還剩192.168.10.1、192.168.10.5兩個(gè);到第三行再添加上192.168.10.3,最終的內(nèi)網(wǎng)IP列表為192.168.10.1、192.168.10.3、192.168.10.5三個(gè)。

4.2. 在企業(yè)網(wǎng)站中集成

配置好DotCommonWebsiteFilter.cfg.xml中的各項(xiàng)參數(shù)并拷貝到網(wǎng)站根目錄。

拷貝DotCommon.WebsiteFilter.dll文件到網(wǎng)站bin目錄。

在網(wǎng)站根目錄下建立與配置文件中相對(duì)應(yīng)的錯(cuò)誤提示頁(yè)(例如sorry.htm)。

修改Web.config在《httpModules》節(jié)點(diǎn)下注冊(cè)WebsiteFilter模塊,代碼如下:

以下為引用的內(nèi)容:
<httpModules>
   
<add name="WebsiteFilter" 
      type
="DotCommon.WebsiteFilterHttpModule, DotCommon.WebsiteFilter"/>
</httpModules>

分別從內(nèi)網(wǎng)、外網(wǎng)訪問(wèn)企業(yè)網(wǎng)站查看運(yùn)行效果。

結(jié)束語(yǔ)

本文僅針對(duì)具體需求闡述解決方案的構(gòu)思過(guò)程,希望對(duì)讀者能有所幫助,歡迎提出改進(jìn)意見(jiàn)。

分享:解讀Java與.NET間進(jìn)行Web Service交互的選擇
談到.NET和Java之間的Web服務(wù)交互性時(shí),通常的選擇只有SOAP over HTTP,而根據(jù).NET 3.0的相關(guān)規(guī)范,這僅有的一個(gè)選擇也將會(huì)受到更多限制,.NET中提供的BasicHTTP將是唯一能直接與Java Web Servcies進(jìn)行交互的方式。 最近,有兩個(gè)新的選擇出現(xiàn)了

來(lái)源:模板無(wú)憂//所屬分類:.Net教程/更新時(shí)間:2009-07-09
相關(guān).Net教程