http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/dnpag2entlib.mspx?mfr=true
http://msdn2.microsoft.com/en-us/library/aa480465.aspx
1 簡介
開發人員經常編寫需要安全功能的應用程序。這些應用程序通常需要執行一系列不同的安全操作,而且它們還經常與不同的基礎安全提供程序(如 Microsoft Active Directory 目錄服務、授權管理器、Active Directory 應用程序模式 (ADAM) 和自定義數據庫等)進行交互。
安全應用程序塊通過收集開發人員必須執行的許多最常見的安全任務,來簡化開發人員的工作。每個任務都以一致的方式處理,從特定的安全提供程序中抽象出應用程序代碼并使用最佳做法。您甚至可以通過更改配置來更改基礎提供程序,而無需更改基礎應用程序代碼。
安全應用程序塊提供的代碼提供如下功能:
(1) 身份驗證
(2) 授權
(3) 角色管理
(4) 配置文件管理
(5) 緩存主體
2. 幾個基本概念(Form MSDN):
(1) Ticket:提供對票證的屬性和值的訪問,這些票證用于Forms身份驗證對用戶進行標識。可以使用FormsIdentity 類的 Ticket 屬性訪問當前經過身份驗證的用戶的 FormsAuthenticationTicket。通過將當前User 的 Identity 屬性強制轉換為類型 FormsIdentity,可以訪問當前 FormsIdentity 對象。
(2) Token:與當前執行線程關聯的訪問標記的句柄,用于獲取用戶的Windows帳戶標記。通常,通過調用非托管代碼(如調用 Win32 API LogonUser 函數)來檢索該帳戶標記。
(3) Identity:Identity封裝有關正在驗證的用戶或實體的信息。在最基本的級別上,Identity包含名稱和身份驗證類型。名稱可以是用戶名或 Windows 帳戶名,而身份驗證類型可以是所支持的登錄協議(如 Kerberos V5)或自定義值。.NET Framework 定義了一個 GenericIdentity 對象和一個更專用的 WindowsIdentity 對象;前者可用于大多數自定義登錄方案,而后者可用于在希望應用程序依賴于 Windows 身份驗證的情況中。此外,您還可以定義自己的標識類來封裝自定義用戶信息。
(4) Principal:Principal表示代碼運行時所在的安全上下文。實現基于角色的安全性的應用程序將基于與主體對象關聯的角色來授予權限。同標識對象類似,.NET Framework 提供 GenericPrincipal 對象和 WindowsPrincipal 對象。您還可以定義自己的自定義主體類。
IPrincipal 定義一個屬性和一種方法,前者用于訪問關聯的 Identity 對象,而后者用于確定 Principal 對象所標識的用戶是否為給定角色的成員。所有 Principal 類都實現 IPrincipal 接口以及任何必需的附加屬性和方法。
Principal對象在應用程序域(AppDomain)中綁定到調用上下文(CallContext)對象。默認的調用上下文總是用每個新的AppDomain創建的,因此總是存在可用于接受Principal對象的調用上下文。創建新線程的同時也為該線程創建CallContext對象。Principal 對象引用從創建線程自動復制到新線程的CallContext中。如果運行庫無法確定哪個 Principal 對象屬于線程的創建者,它將遵循Principal和Identity對象創建的默認策略。
可配置的應用程序域特定策略定義了一些規則,用以決定同新的應用程序域關聯的 Principal 對象類型。在安全策略的允許范圍內,運行庫可創建 Principal 和 Identity 對象來反射同當前執行線程關聯的操作系統標記。默認情況下,運行庫使用 Principal 和 Identity 對象表示未經身份驗證的用戶。運行庫不創建這些默認的 Principal 和 Identity 對象,除非代碼試圖訪問它們。
創建應用程序域的受信任代碼可設置應用程序域策略,以控制默認 Principal 和 Identity 對象的構造。此應用程序域特定的策略適用于該應用程序域中的所有執行線程。
3. 使用:
(0) 使用EntLib配置工具配置App.config/web.config:
a) 創建Cacheing Application Block(緩存Identity、Principal或Profile時要用到CAB)和Security Application Block;
b) Security Application Block->Security Cache->New->Caching Store Provider->將CacheManager指定到上面創建的Cacheing Application Block;
c) Security Application Block->Security Cache->New->RuleProvider。
(1) SaveIdentity(用戶登錄時,緩存用戶所對應的Identity):
ISecurityCacheProvider cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");
IIdentity identity = null;
if (Membership.ValidateUser("username", "password"))//驗證用戶是否合法
{
identity = new GenericIdentity("username", Membership.Provider.Name);//為合法用戶創建Identity
}
IToken token = null;
if (identity != null)
{
token = cache.SaveIdentity(identity); // Cache the identity.
}
//我們也可以調用SavePrincipal或SaveProfile來緩存Pricipal或Profile,這些對象是通過同一個Token進行關聯的。(2) 根據Token驗證用戶是否合法:
ISecurityCacheProvider cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");
IIdentity savedIdentity = cache.GetIdentity(token);//返回與token關聯的Identity,如果token過期或者不合法,則返回null(3) 終止Session:
ISecurityCacheProvider cache = SecurityCacheFactory.GetSecurityCacheProvider("Caching Store Provider");
cache.ExpireIdentity(token);(4) 檢測用戶是否有權限執行某個操作:
string[] roles = Roles.GetRolesForUser(userName);
IPrincipal principal = new GenericPrincipal(new GenericIdentity(userName), roles);
bool authorized = ruleProvider.Authorize(principal, "Submit Order");
4. Security Application Block的設計:


浙公網安備 33010602011771號