ASP.NET鑒別和授權(quán)
Web應(yīng)用程序會遭到幾種類型的攻擊,其破壞效果會因程序本身的不同而不同。因此,安全性是與程序的用法和用戶與其功能交互的方式密切相關(guān)的。那么,應(yīng)該如何來設(shè)計和編碼ASP.NET應(yīng)用程序呢?
從應(yīng)用程序的角度來看,安全性通常指對用戶的鑒別以及對系統(tǒng)資源授予訪問權(quán)限。ASP.NET提供了許多鑒別和授權(quán)機(jī)制,它們與IIS、。NET Framework以及操作系統(tǒng)底層的安全服務(wù)是相連的。
當(dāng)一個客戶端發(fā)出一個Web請求時,將發(fā)生下列順序的鑒別和授權(quán)事件:
1.IIS鑒別
2.ASP.NET鑒別
3.ASP.NET授權(quán)
ASP.NET鑒別
如果頁面是可以被察看的,而請求來自一個非受限的IP地址,IIS將通過預(yù)定義的鑒別機(jī)制來對調(diào)用請求進(jìn)行鑒別。首先IIS確保請求來自一個可信任的IP 地址。如果不是,請求將以HTTP錯誤403.6而被拒絕。第二個措施是檢查被請求的資源是否可以被讀或被瀏覽。如果不是,請求將以HTTP錯誤 403.2而被拒絕。然后IIS嘗試使用Intergrated、Digest或Basic方法來鑒別這個調(diào)用。如果用到了Windows的 Intergrated方法,Kerberos或NTLM將被使用。如果請求通過了這一關(guān),就輪到ASP.NET出場了。
ASP.NET支持三種類型的鑒別方法:Windows、Forms和Passport.如果ASP.NET被配置為Windows鑒別,則它不需要其它的步驟,而是直接承認(rèn)任何從IIS傳來的安全標(biāo)記。如果ASP.NET被配置為Forms鑒別,將使用一個HTML表單提示用戶輸入信任資料。通過用戶ID和密碼在存儲的合法用戶列表中查尋。應(yīng)用程序可以任意選擇最合適的存儲機(jī)制,包括SQL Server數(shù)據(jù)庫或Active Directory服務(wù)。最后如果ASP.NET被配置為Passport鑒別,用戶將被轉(zhuǎn)入一個Passport Web站點并由Passprot服務(wù)來鑒別。
第四中類型的鑒別是None,這意味著ASP.NET并不執(zhí)行自己的鑒別而是完全依靠已經(jīng)由IIS執(zhí)行的鑒別。在這種情況下,匿名用戶可以連接進(jìn)來,而訪問資源使用的是ASP.NET賬戶。將ASP.NET鑒別模式設(shè)定為None并不妨礙程序?qū)崿F(xiàn)自己的鑒別層。
在Web.config文件中通過使用區(qū)段來選擇ASP.NET鑒別機(jī)制。默認(rèn)的鑒別模式是Windows.
ASP.NET授權(quán)
當(dāng)然,鑒別只是意味著用戶被確認(rèn)為是其本身。下一步是確認(rèn)用戶擁有足夠的權(quán)限來訪問請求的資源。
在鑒別完之后,ASP.NET將校驗調(diào)用是否被授權(quán)用以訪問請求的資源來執(zhí)行操作。一對HTTP模塊提供了這項服務(wù):UrlAuthorizationModule和 FileAuthorizationModule.前者確保Web.config文件中區(qū)段中的授權(quán)規(guī)則完全實現(xiàn)。后者在使用Windows鑒別時來檢查調(diào)用是否有足夠的訪問許可來訪問請求的資源。在這種情況下,通過比較訪問資源的控制列表(ACL)調(diào)用的標(biāo)記來執(zhí)行校驗。在處理過程中,也可以用。NET roles來改變調(diào)用者的權(quán)限以便使用某個資源。
授權(quán)規(guī)則由兩部分獨立的信息組成,它們定義了哪些是允許的那些事禁止的。在區(qū)段內(nèi),標(biāo)記定義了允許的用戶、任務(wù)和操作。相反,在標(biāo)記中包含了不被允許的用戶、任務(wù)和操作。
你也許注意到鑒別模式只能在machine.config文件或在程序?qū)拥腤eb.config文件中設(shè)置,子目錄繼承了程序的鑒別模式。但是,授權(quán)設(shè)置可以在每個子目錄的Web.config文件中設(shè)置。換句話說,授權(quán)比鑒別支持更細(xì)。
基于角色的安全
如果你需要鑒別用戶,你同樣需要為他們建立個性化的頁面。這里有兩大的選擇:一是實現(xiàn)一個個人資料系統(tǒng),為每個用戶存儲配置信息;二是定義一些角色,把用戶映射到這些角色上。
在第一種情況下,要維護(hù)個人資料記錄,可能需要存儲與用戶界面有關(guān)的設(shè)置以及打開或關(guān)閉的功能。在設(shè)計頁面時,訪問這些個人資料記錄來為當(dāng)前用戶生成相應(yīng)的頁面。
如果你不必維護(hù)每個用戶的信息,而只是要將用戶分類并維護(hù)基于每一類的信息,那基于角色的方法就顯得更好。一個角色是一個名稱——一個簡短的描述性字符串——它為屬于這個角色的每個用戶定義了一組功能、用戶界面元素以及權(quán)限。
定義角色需要兩個步驟。首先,定義所有可能的角色,為每個用戶分配其中的一個或多個。這通常在數(shù)據(jù)庫層完成。典型的,你在存儲用戶名字和密碼的數(shù)據(jù)庫中加入一列來存儲每個用戶的角色。
鑒別一個用戶時,其身份并沒有和任何角色信息關(guān)聯(lián)。但是,有一個功能用來來檢查某一個身份是否屬于特定的已定義角色。可以使用Page.User對象的IsInRole功能來檢驗一個用戶的角色: if(User.IsInRole(“Boss”))
Response.Write(“The user is the boss”);
定義角色的第二步是將每個已鑒別的用戶與角色相關(guān)聯(lián)。要這樣做,你必須創(chuàng)建一個新的主體對象,其類型可以是普通的或與授權(quán)種類相同。通常在 Global.asax文件中處理AuthenticateRequest事件時完成: //角色是根據(jù)當(dāng)前用戶從數(shù)據(jù)庫中讀出的字符串
Context.User=new GenericPrincipal(User.Identity,role);
這時,鑒別模塊能夠通過本地Web.config文件的區(qū)段來檢驗用戶的角色。例如,一個其Web.config文件如下所示的文件夾里的頁面只能被屬于Boss角色的用戶訪問: 鑒別模塊使用IsInRole函數(shù)通過角色來授權(quán)。
保護(hù)你的應(yīng)用程序
保護(hù)一個Web應(yīng)用程序就必須保護(hù)Web服務(wù)器不受各種攻擊,但是它還需要實現(xiàn)有效的辦法來阻止對頁面的非法訪問。ASP.NET提供了一些內(nèi)建的代碼來對用戶和操作來進(jìn)行鑒別和ASP.NET授權(quán)。以上是介紹ASP.NET鑒別和授權(quán)機(jī)制
【編輯推薦】


















