公告資訊

未經授權,禁止轉載網站文章與內容。如有需要可以跟我聯絡,謝謝!!




2010年9月15日 星期三

如何結合網域帳戶,自訂ASP.NET應用程式授權

預設在ASP.NET應用程式當中,支援兩種驗證模式:

  • Windows 驗證:利用IIS驗證使用者的Windows帳戶,然後存取ASP.NET應用程式。
  • Forms驗證:利用ASP.NET當中自訂的登入表單,搭配MemberShip資料庫驗證使用者身分。

在企業內部,比較常用到的,應該會是Windows驗證,因為如此一來,使用者就不需要為了存取不同的ASP.NET應用程式,而重複進行登入的動作。然而,因為Windows驗證預設必須要搭配使用者的Windows群組資訊來授權,為了管理使用者在不同的應用程式中不同的執行權利,往往必須要在AD當中建立不同的群組;同時IT管理人員也必須要常常隨著使用者的升遷或是轉換部門,而調整使用者AD的群組狀態。

另一個問題是,擁有(管理)應用程式的部門,也通常不是管理AD的IT單位,因此若是要在應用程式當中建立新的群組授權,就必須要知會其他單位,不僅不方便,協調與溝通若是出錯的話,對於使用者也會是一大困擾。

"何不就讓使用者透過Windows帳號登入ASP.NET應用程式,然後再由ASP.NET應用程式自行針對Windows帳號授權 ?"

解決之道,就是結合Windows驗證與Forms驗證,讓企業內部的使用者可以透過Windows帳號登入ASP.NET應用程式之後,再使用MemberShip資料庫的資料進行授權。這樣使用者一樣可以使用Windows帳號存取應用程式,同時每個ASP.NET應用程式的管理人員也可以自己管理使用者的登入與授權的權利。。[筆者按:這不是微軟建議的標準使用方式,ASP.NET的課程也不會這樣教]

image

請參考上面的概念圖,當每個Http Request傳送到Web Server時,會先被IIS攔截,並且根據Web應用程式目錄設定的驗證模式驗證使用者(標示 1);有了存取Web應用程式目錄的權限之後,Http要求才會被送到ASP.NET應用程式當中。一般若是要使用ASP.NET的Forms驗證模式的話,通常IIS的應用程式目錄會設定 "匿名驗證 " (標示 1),再由ASP.NET自訂的Login表單與MemberShip資料庫進行驗證授權(標示 2)。

了解了ASP.NET與IIS的驗證/授權概念之後,要結合網域帳戶,自訂ASP.NET應用程式授權的工作其實相當簡單,我們只需要在Web應用程式目錄啟用Windows驗證模式(標示 1),再將Windows使用者帳號設定到MemeberShip資料庫中,就可以直接在ASP.NET應用程式當中根據該Windows帳號進行授權(標示 2)。操作步驟如下:

1. 首先,在IIS上先啟用 "Windows 驗證",由IIS驗證使用者的Windows帳號

image

2. 在 ASP.NET應用程式的web.config檔中,設定啟用Forms驗證,同時排除匿名使用者:

image

3. 在Login表單的程式碼當中,先透過 "Request.LogonUserIdentity.Name" 屬性,取出IIS所驗證的使用者Windows帳號,再送到MemberShip資料庫當中比對。

image

如此一來,你只要將可以存取ASP.NET應用程式的使用者Windows帳號名稱,透過程式或是管理介面加入MemberShip資料庫當中,再設定該Windows帳號在ASP.NET應用程式當中所屬的群組,就不需要到AD當中去設定群組資訊了!!

image

4. 最後,在需要檢查授權的程式碼中,只需要透過 "User.IsInRole" 方法,就可以檢查該Windows使用者帳號在ASP.NET應用程式當中,是否屬於已被授權的群組:

image

透過這種方式,在企業內部的ASP.NET應用程式,就可以自行管理Windows使用者帳號的存取權限,而不需要透過AD的群組了….

3 則留言:

Hector Lee 提到...

另一個Case: 反過來用AD群組來管理權限,除了在Web site可用外,其它如: file server(NT) ,Sps亦可用此群組統一管理,也蠻實用的.

John 提到...

使用AD群組管理ASP.NET應用程式授權,最大的問題是要去維護AD的群組資訊。當應用程式上線之後,每次使用者或是組織異動,或是設定細部的應用程式授權都要發case去異動AD,久了之後很難去管理--特別是每個不同應用程式需要的授權規則又不盡相同,龐大而且沒有更新的AD群組/使用者資訊,其實也不是好管理的..

John 提到...

從這一個範例,我們可以延伸思考一下:在每個ASP.NET應用程式中,如果每頁上面的不同功能,希望搭配Windows帳號做授權,使用MemberShip建立應用程式使用者群組/權限的管理系統,或是全部用AD去做管理,哪一種是比較方便的?

最新回應

Loading...

即時與版主對話


(若狀態顯示"忙碌"時,我可能無法馬上回應。你可以留下Email,我會盡快跟你聯絡,謝謝喔!!)