公告資訊

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




2010年9月27日 星期一

Windows Server AppFabric Caching (3) - 與資料庫存取在效能方面的比較

在利用Windows Server AppFabric Caching,建立大量資料存取的系統時,Windows Server AppFabric可以大大的減輕系統存取資料庫時所造成的I/O負擔,同時其Key-Value的存取方式也讓程式可以透過Key值直接取得所需要的物件,不需要花時間建立資料連線。下面分享一個實際的測試結果:

在這一個測試當中,我將4000萬筆資料從資料表搬到Cache當中儲存,再與資料庫查詢同一筆資料的結果作比較;資料庫與Cache Server都在美國的Data Center中。在沒有啟用Local Cache功能時,第一次查詢資料的結果為:

image

相同的條件再執行一次,結果為:

image

從結果可以看出,使用資料庫查詢在第一次建立資料連線時,需要耗費相當的時間;而當資料連線建立完成之後,後續的存取時間使用Cache或是使用資料庫其實差異不大。但就如同一開始所說的,使用Cache可以減輕資料庫I/O的負擔,這對於我們一天有幾十GB資料要新增的系統來說,有相當的幫助。

接下來,我們啟用LocalCache之後,再重新測試一次:應用程式第一次查詢資料的結果和之前差不多:

image

(請想想,相對於對第一次資料庫存取而言,為何這一次快了一倍? )

相同的條件再執行一次,結果為:

image

0 毫秒!!

對於大量提供資料的應用程式而言,Windows Server AppFabric Caching 除了可以減輕資料庫的負擔之外,當啟用LocalCache之後,AppFabric Caching會自動將使用過的物件快取在應用程式當中,當下次要再使用相同的物件時,就不需要再從Cache Layer當中去存取物件,因此幾乎是即時就可以取得資料!!

但需要注意的是,雖然Cache可以讓我們在近乎即時的狀況之下使用物件,但是在設計上,Key-Value相對於關聯式資料庫而言,是完全不同的效果,同時資源的消耗上也是完全不同的。下次,再來談設計上的考量…

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的群組了….

最新回應

Loading...

即時與版主對話


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