asp.net 角色身份驗證的使用

鴨脖發表於2013-11-12

序:其實就是將角色寫入cookie或session,在每次請求時檢查這個字串。 

ASP.NET有三種驗證模式:windows,forms,passport。其中forms驗證使用的最多。

          forms驗證對基於驗證授權提供了很好的支援,可以通過session,cookie對使用者資訊就行儲存,使前後臺有很好的資訊溝通。

不過問題也來了,我們在做設計時往往需要基於角色的管理,有人會說了,ASP.NET給了一個角色管理。可是這種角色管理太死板,不利於擴充套件。我們常常是用sql server或oracle等資料庫儲存使用者資訊和角色,這正是我們要討論的核心,怎樣用自己的資料庫實現角色管理。

首先,我們看下forms的基本原理:

一,身份驗證

要採用forms驗證,先要在應用程式的web.config中進行設定

<anthentication mode="forms">

    <forms name=".aspnet" loginurl="/default.aspx" protection="all" timeout="30" path="/">

</anthentication>

其中<anthentication mode="forms">表示驗證方式是表單,<forms>中的name表示身份驗證的httpcookie的名字。採用這種方式驗證後的使用者,已此使用者的資訊建立一個formsAuthenticationTicket型別的身份驗證票據,再序列化為一個字串,最後將這個字串寫入到客戶端的cookie中。一旦資訊寫入cookie,以後每次客戶端向伺服器傳送資訊都會將cookie一起傳送,這樣我們就可以在伺服器分析cookie中的資訊,確定身份,當然還有角色。

    好我們仔細看下FormsAuthenticationTicket都包含哪些資訊呢:

public FormsAuthenticationTicket(int version,string name,datetime issuedate,datetime expiration,bool ispersistent,string userdata,string cookiepath)

cookiepath:返回發出的cookie路徑。注意窗體的路徑設定為 / 。由於窗體區分大小寫,這是為防止站點中URL的大小寫不一致而採取的一種保護措施。這在重新整理cookie時有用

Expriation:獲取cookie的過期時間

IsPersistent:如果已發出持久的cookie,則返回true。否則身份驗證cookie將限制在瀏覽器生命週期內。

IssueDate:獲取最初發出cookie的日期和時間。

Name:獲取與身份驗證cookie關聯的使用者名稱。

UserDate:獲取儲存在cookie中應用程式定義字串。(這個欄位正是我們的關鍵)

version:返回位元組版本號供將來使用。

<forms>中loginurl指定如果沒有找到任何有效的身份驗證cookie,則頁面將重定向到這個頁面,實現登入。一般這個頁面就是一個使用者名稱和密碼的表單,通過資料庫查詢進行核對使用者資訊。並通過formsauthentication.redirectfromloginpage方法來完成身份驗證票寫回客戶端,瀏覽器重定向等操作。

public  static void redirectfromloginpage( string username,bool createpersistentcookie, string strcookiepaht);

其中username:就是此使用者的標示,用來標示此使用者的唯一標識,不一定要對映到使用者的帳號名。

createpersistentcookie:標示是否發出持久的cookie。

如不是持久的cookie,cookie的有效期就是Expiration屬性加上web.config中timeout。持久的就是50年,每次使用者請求時,會判斷是否過了有效期的一半,若是就更新cookie的有效期。

strcookiepath:標示將生成的cookie寫入到客戶端的路徑,若沒有strcookiepath引數,則使用web.config中的path設定。

這裡可以看到,此方法只有三個引數,而身份驗證票有七個屬性,不足的四個引數是這麼來的:

IssueDate:cookie發出時間由當前時間得出,

expiration:過期時間由當前時間和timeout時間算出。

userdata:這個屬性可以用應用程式寫入一些使用者自定義的資料,此方法沒有這個屬性,只是簡單的將資料設定為空,不過注意,在後面我們要用到這個屬性。

varsion:版本號由系統自動提供

redirectfromloginpage方法生成身份驗證票後,會呼叫formsauthentication.encrypt方法,將身份驗證票加密為字串,這個字串將是.aspnet為名的cookie的值。

 

訪問授權

驗證了身份,要是使用這個身份,根據不同的身份我們可以進行不同的操作,處理,最常見的就是對不用的身份進行不同的授權。forms授權是基於目錄的,在WEB.CONFIG中可以這樣設定

<authorization>

    <allow users="" roles="" verbs=""/>

    <deny users="" roles="" verbs=""/>

</authorization>

allow表示允許,deny表示拒絕

users表示分隔的使用者

rolse表示角色

verbs表示http的傳輸方法,如get,post等

若屬性中出現*,如users=“*”表示所有使用者,users=“?”表示匿名使用者

下面看下user和role的詳細過程:

1,一旦一個使用者訪問了網站,就進行了身份確認,身份驗證票就寫入了客戶端。之後,這個使用者每次申請web頁面,具有身份驗證票的cookie就會傳送到伺服器。在伺服器端,ASP.NET對每個http請求都分配一個httpapplication物件來處理這個請求,在

httpapplication.authenticationrequest事件後,安全模式已建立了使用者標識,就是此使用者的身份在web端已建立起來,這個身份完全是由客戶端傳送來的身份驗證票的cookie建立的。

2,使用者身份存在於httpcontext.user屬性中,在頁面中可以通過page.context來獲取httpcontext物件。對於forms驗證,httpcontext.user屬性是一個genericPrincipal型別的物件,genericPrincipal只有一個公開的屬性identity,有一個私有的屬性m_role屬性,是string【】型別,存放此使用者是屬於那些role的陣列,還有一個公開的方法isinrole( string role),來判斷此使用者是否屬於這個角色。由於身份驗證票的cookie中根本沒提供這個role屬性,就是說forms身份驗證票沒有提供此使用者的role資訊,所以,對forms驗證,在伺服器端得到的genericPrincipal使用者物件的m_role屬性永遠是空的。

3,genericPrincipal.identity屬性是一個formsidentity型別的物件,這個物件有個name屬性,就是此使用者的標識,訪問授權是將這個屬性做為user類進行授權驗證的。formsidentity還有一個屬性,就是ticket屬性,此屬性是身份驗證票formsauthenticationticket型別,就是之前伺服器寫到客戶端的身份驗證票。

相關文章