引言
前一段時間有兩個朋友問我,為什麼在HttpModule中無法獲得到Session值,因為他們希望自定義一個 HttpModule,然後在其中獲取Session來進行用戶驗證。我奇怪為什麼不使用.Net Framework已經提供的 驗證機制,而要和Asp時一樣,自己手工進行cookie+Session驗證?我們是基於.Net Framework這個平台 進行編程,所以我覺得,在很多情況下,使用Framework已經建立好的機制會顯著地提高工作效率,而 且.NET Framework內置的驗證機制通常也更加安全。
.Net提供了一整套的驗證和授權機制,這裡驗證和授權是不同的概念,驗證(Authentication)是指 “證明你確實是你所說的人”,通常是提供一個用戶名和口令,然後與持久存儲(比如數據庫)中的用戶名 和口令進行對比。授權(Authorization)是指“你是否有足夠的權限做某件事”,此時你的身份已經被 證明過了(匿名用戶、會員還是管理員),授權通常與用戶組或者用戶級別聯系起來,不同的用戶組擁有 不同的權限(訪問特定頁面或者執行特定操作)。
回想一下我剛接觸.Net時,也曾經完全繞過.NET的驗證,自己編碼采用Cookie+Session實現身份驗證 ,並且一個Asp.Net 登錄控件都沒有使用,那時候的理由是:我要使用自定義的用戶表,不能使用 Asp.Net安全機制在App_Data下自動生成的AspNetDB.mdf中的一系列數據表。除此以外,還有一個原因, 就是.Net驗證機制的核心IPrincipal和Identity提供的信息用戶信息太少了,當在頁面後置代碼中使用繼 承來的User屬性(IPrincipal類型)時,它的Identity屬性只有一個Name與用戶數據相關 (AuthenticationType與IsAuthenticated都是與驗證相關),而很多時候我們都需要許多額外的用戶數據 。其實這只是一個誤解罷了,以為使用Asp.Net的驗證機制和登錄控件就一定要使用其附帶的數據表,以 為Identity就只能攜帶一個Name屬性。
實際上,.NET的安全機制包括了幾個部分,除了驗證以外,還包括MemberShip、Profile、Role等,我 們完全可以只使用它的驗證機制,而繞過它的MemberShip、Profile和Role,來實現通常我們用 Cookie+Session完成的功能,而且更高效更安全。這篇文章將快速地實現這樣的一個流程。
開始前的准備
創建頁面,配置Web.config
我們先創建解決方案、建立站點,然後在站點中添加下述文件,它們將會在後面使用: