在當今的資訊世界裡, 無論是門戶網站, 電子商務, 社區論壇, 都有一個共性: 它們通常都需要驗證目前使用者的身份並根據驗證結果判斷使用者所具有的許可權.
例如部落格園, 它允許未註冊的匿名使用者可能查看文章, 但是不允許他們發表文章. 為了能夠發表文章, 匿名使用者必須先註冊為正式使用者. 在註冊為正式使用者的過程中, 通常需要如下一些共通的步驟.
(1). 建立一個 Users資料表來存放註冊使用者的資訊.
(2). 建立一個註冊頁面 (Register.aspx)讓匿名使用者註冊.
(3). 建立一個登入頁面 (Login.aspx)讓註冊使用者登入系統.
(4). 建立一個機制記錄住使用者狀態, 這樣當使用者發帖或者回複時不用再次登入.
但是僅僅驗證了使用者還不夠, 系統還需要擷取使用者所具有的許可權, 也就是註冊使用者可以做什麼, 不可以做什麼. 仍以部落格園為例, 大家都知道, 同樣是註冊使用者, 版主可以修改他人的文章, 而系統管理員又可以任命各個版塊的版主. 為了實現這種功能就需要引入許可權管理, 通常需要如下一個些共通的步驟:
(1). 建立一個 Roles 表格儲存體使用者的角色 (例如管理吊, 版主等).
(2). 建立一個 Users-Roles 表映射管理對使用者的管理.
(3). 建立一個管理員頁面, 以便讓管理員對使用者進行設定.
(4). (不是必須的), 可能需要一個郵件發送頁面, 這樣當使用者在密碼丟失後可以找回密碼.
看來驗證和授權有著某種 "曖昧"的關係, 這裡就先從驗證開下手吧.
一. 身分識別驗證: 簡單的講, 就是系統需要採用什麼樣的一種方式來驗證. ASP.NET提供了3種使用者驗證模式, 分別是 Windows ( 使用直接通過 IIS 提供的身分識別驗證), Forms 視窗驗證 ( 使用應用程式特定的邏輯進行驗證 )和 Passport護照驗證(由 Microsoft提供的集中驗證服務).
身分識別驗證模式在 web.config中指定.文法如下:
<authentication mode= " windows | Forms | Passport | Node ">
</authentication>
由於平時用的較多的為表單驗證模式 ( Forms), 這裡就 forms驗證作一詳細的分析 .
表單驗證將登入資訊記錄在 Cookies 中, 一般情況下我們都會在此設定中將未通過驗證的使用者重新導向到登入介面.
Forms驗證常用的屬性有:
(1). loginUrl: 如果找不到任何有效身分識別驗證 Cookie, 將請求重新導向到使用者登入的 URL.
(2). Name: 指定要使用者身分識別驗證的 HTTP Cookie. 如果正在一台伺服器上運行多個應用程式且每個應用程式都需要唯一的 Cookie, 則必須在每個應用程式的 web.config檔案中配置 Cookie名稱. 預設為 ".ASPAUTH".
(3). Path: 為應用程式發出的 Cookie 指定路徑.預設是斜杠 ( / ), 注: 要區分大小寫.
(4). Protection : 安全設定.
(5). Timeout: 指定 Cookie 到期的時間.
這裡以一個簡單的例子更進一步說明上面的屬性是如何應用的.
<authentication mode= "Forms ">
<forms name=".MyCookie" longinUrl="Login.aspx" protection ="All" timeout="30" path= "/">
<credentials passwordFormat="Clear">
<user name="admin" password="amdin" />
<user name="A" password="a" />
</credentials>
</forms >
</authentication>
<authorization>
<deny users=" ?" /> //授權管理, 後面馬上講到.
</authorization>
這樣我們基本上完成了一個最簡單的驗證, 下面將與驗證結合來分析授權管理.
二. 授權管理: 授權決定了是否應授予某個標識對特定資源的存取權限. 即你有無許可權訪問某一個網頁或某一類網頁. 在ASP.NET中, 有兩種方式來授予對給定資源的存取權限.
1. 檔案授權: 檔案授權由 FileAuthorizationModule 執行. 它檢查 .aspx 和 .asmx 處理常式檔案的存取控制清單 ( ACL), 以確定使用者是否該具有對檔案的存取權限. ACL 許可權用於驗證使用者的 Windows 標識 ( 如果已僱用 Windows 身分識別驗證 ) 或 ASP.NET 進程的 Windows 標識. 這種方式在平時的設計中用到的機率一般不大.
2. URL授權: URL授權也是我們最常用的也一種授權方式. 由 UrlAuthorizationModule 執行, 它將使用者和角色映射到 ASP.NET 應用程式中的 URL. 這個模組可用於有選擇允許或拒絕特定使用者或角色對應用程式的任意部分 ( 不過, 一般都選擇目錄作為授權對象) 的存取權限.
下面我們就重點來分析 URL授權方式.
(1). 通過 URL 授權, 可以顯式允許或拒絕某個使用者名稱或角色對特定目錄的存取權限.為此, 在該目錄的設定檔中需要建立一個 authorization 節. 若要啟用 URL 授權, 就在設定檔 authorization 節中的 allow 或 deny 元素中指定一個使用者或角色列表. 為目錄建立許可權也會應用到到子目錄, 除非子目錄中的設定檔重寫這些許可權.
(2). Authorization 節的定義較為簡單, 文法如下:
<authorization>
<[ allow | deny ] user /roles/verbs />
</authorization>
其中 allow或deny 元素是必須的. Allow 和 deny 元素分別授予存取權限和撤銷存取權限.
(3). Allow 和 deny 元素支援的屬性有 user, roles, verbs. 解釋如下:
Users 屬性: 標識 allow或 deny元素的目標身份(即我們常叫的使用者賬戶), 具體定義為用問號 (?) 標識匿名使用者, 用星號(*)指定所有經過身分識別驗證的使用者.
Roles: 為被允許或被拒絕訪問資源的當前請求標識一個角色 , 即某一類使用者是否被允許進入某一個網頁或某一類網頁.
Verbs: 定義操作所要應用到的 HTTP 謂詞, 如GET, HEAD, POST等. 預設為*, 指定所有謂詞.
(4). 以例為例: 下面的操作對 使用者A 和 Admins 角色的使用者授予存取權限. 同時對 B ( 注: 如果 B使用者屬於 Admins 角色則具有存取權限 ) 和所有匿名使用者拒絕存取權限.
<authorization>
<allow users="A" />
<allow roles="Admins" />
<deny urses="B" />
<deny users=" ? " />
</authorization>
先到此...後面會有系列章節
希望對初學者有所協助.