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