ASP.NET2.0應用中定制安全憑證之理論篇
閱讀提要 在缺省狀況下,你只能使用Visual Studio 2005的一個本機實例來管理與ASP.NET 2.0一同發行的SQL Server數據庫中的安全憑證。本文將向你展示怎樣用一個Web服務來包裝ASP.NET 2.0提供者并通過使用一個Windows表單應用程序來管理憑證存儲從而擴展這種管理能力。
如今,無論是互聯網還是企業內部局域網程序一般都要求使用定制的方式來存儲和管理用戶帳戶和角色。為此,ASP.NET 2.0提供了一個現成的提供者模型和一個SQL Sever數據庫。不幸的是,只能通過Visual Studio 2005來管理該憑證數據庫且只能針對本機Web應用程序。這無疑是非常不方便而且不能廣泛使用的。
本文描述了一個超級用戶可以使用的完全定制的安全管理應用程序。這個應用程序通過用一個WEB服務對ASP.NET 2.0提供者進行了包裝并增加了一些功能。本文詳細描述了其中的設計方法,面臨的問題和包含在應用程序中的技術。同時還向你介紹了一些有用而強有力的技術,如基于接口的Web服務,基于反射的Web服務兼容性,高級C# 2.0編程,Web服務安全性和Web服務事務等。
一、ASP.NET 2.0憑證基礎結構
基于互聯網的應用程序常常不依賴Windows帳戶和組,而是依賴于基于表單的認證并結合某種如SQL Server的后臺定制憑證存儲。為了幫助開發者免除重復設計和構建這樣的解決方案,ASP.NET 2.0發行中加入了一個現成的安全憑證基礎結構。ASP.NET 2.0憑證存儲并不僅可用于ASP.NET應用程序,而且ASP.NET Web服務和Windows表單應用程序都能使用它來管理它們的用戶憑證。另外,Windows通訊基礎(編碼名為Indigo)服務也能被容易地設置來使用ASP.NET 2.0安全憑證存儲。
ASP.NET 2.0使用一提供者模型來訪問和管理憑證以避免把應用程序耦合到任何特定存儲上。在利用抽象提供者模型的優點的同時由程序員來開發這個應用程序。超級用戶負責選擇和管理特定的憑證存儲。圖1顯示出ASP.NET 2.0安全提供者的架構。
Membership Provider負責管理用戶,而Role Provider負責管理角色。在憑證存儲中,每個用戶或角色僅限于一應用程序之內。這樣就允許不同應用程序使用一樣的憑證存儲而不會與彼此的用戶名或角色相沖突。ASP.NET為SQL服務器、Windows和活動目錄(見圖1)等的憑證存儲提供支持。為了安裝SQL Server憑證數據庫,可以運行aspnet_regsql.exe程序,其位置是:
<WINDOWS>Microsoft.NETFramework<version>
這個安裝程序創建一個稱為aspnetdb的新數據庫-它包含一組應用程序的表、用戶、角色以及存取這些表的存儲過程。這個SQL Server數據庫是運用最新的安全技術經過精心設計的。另外,ASP.NET 2.0還提供一套相應于提供者的類(圖1)。
使用哪個提供者的信息被保存在應用程序的配置文件(App.Config或Web.Config)中。你幾乎不需要直接與特定的提供者進行交互;而是,存在兩個靜態助理類:Membership和Roles-它們負責從配置文件中讀取使用哪個提供者。默認的提供者(即當沒有指定提供者時)就是SQL Server。Membership類(列表1)允許你創建和刪除用戶,檢索關于用戶的信息并觀看口令策略。
列表1: Membership助理類
例如,為了在"MyApp"應用程序中創建一新用戶,你僅需如下編碼:
Roles類允許你創建和刪除用戶角色,從角色中添加或刪除用戶,檢索用戶的角色會員信息以及驗證角色會員。下面是該類的定義:
例如,要把角色"Manager"添加到應用程序"MyApp"上,你可以如下編碼:
二、管理憑證存儲
如果你選擇使用Windows或活動目錄來存儲你的應用程序的用戶和角色,那么你需要使用相應于這些存儲的工具來管理,例如計算機控制面板小程序或活動目錄工具。其實,真正的問題在于如何管理存儲在SQL Server中的憑證。為此,你可以使用Visual Studio 2005和一個Web瀏覽器,甚至不需要安裝IIS。在一ASP.NET Web工程中,從"Website"菜單下選擇"ASP.NET配置"。這將使得Visual Studio宿主一個Web服務器,打開一可用的端口并且導航到一套管理頁面(見圖2)。這些管理頁面修改該Web應用程序配置文件并且也可以管理憑證存儲(當不選擇Windows認證時)。當使用Visual Studio 2005時,你首先需要選擇認證類型。你可以選擇Windows或表單認證(互聯網存取)。如果你選擇表單認證,你還可以執行下列操作:
·啟動或取消基于角色的安全
·創建和刪除角色
·創建和刪除用戶
·檢索一用戶的細節
·設置一用戶的狀態
·給用戶賦于某角色
·從角色中刪除用戶
既然SQL Server是ASP.NET 2.0提供的唯一的企業級定制憑證存儲,你可以單獨使用Visual Studio 2005驅動的管理頁面來管理aspnetdb數據庫,而不用任何其它存儲。
三、內置功能的不足
對于Visual Studio 2005驅動的管理頁面存在一些重要缺點:第一,你需要Visual Studio 2005。應用程序或系統超級用戶可能沒有Visual Studio 2005,更不用說如何使用它了。缺省地,該管理頁面使用一斜杠(/)來管理應用程序命名,并且沒提供任何修改方法。第二,不可能存在遠程存取-應用程序和Visual Studio 2005必須共存,這樣Visual Studio 2005才能存取應用程序的配置文件。第三,基于瀏覽器的用戶接口也不很友好-你需要不斷點擊Back按鈕,而且用戶接口反映相當遲鈍。另外,許多超級用戶可能想使用的特征無法經由頁面管理來實現,這就脫離了底層提供者類所支持的特性這一事實。這種方式還不能實現的方面有:
·更新大多數用戶帳戶細節
·檢索、改變、重置一用戶的口令
·檢索當前在線用戶數目信息
·能夠從一次操作的一個角色中刪除全部用戶
·檢索關于口令管理策略(例如長度、重置策略、口令類型等)的信息
·測試用戶憑證
·驗證用戶角色身份
而且,還有其它的超級用戶可能想要的特征也得不到支持。這些特征包括能夠檢索數據庫所有應用程序列表,能夠從一應用程序中刪除所有的用戶,能夠從一應用程序中刪除所有的角色,能夠刪除一應用程序(和它的所有相聯系的用戶和角色),能夠刪除所有的應用程序。總之,盡管ASP.NET 2.0提供了一個第一流的全面的憑證管理,然而它僅提供了一些原始的管理選項,一般的實際超級用戶是不會使用它的。
這一切促使我自己來開發一個定制的客戶端憑證管理器應用程序來彌補這些不足。圖3顯示該程序的一個快照。后面的部分將介紹我是如何設計和構建該憑證管理器的。
如今,無論是互聯網還是企業內部局域網程序一般都要求使用定制的方式來存儲和管理用戶帳戶和角色。為此,ASP.NET 2.0提供了一個現成的提供者模型和一個SQL Sever數據庫。不幸的是,只能通過Visual Studio 2005來管理該憑證數據庫且只能針對本機Web應用程序。這無疑是非常不方便而且不能廣泛使用的。
本文描述了一個超級用戶可以使用的完全定制的安全管理應用程序。這個應用程序通過用一個WEB服務對ASP.NET 2.0提供者進行了包裝并增加了一些功能。本文詳細描述了其中的設計方法,面臨的問題和包含在應用程序中的技術。同時還向你介紹了一些有用而強有力的技術,如基于接口的Web服務,基于反射的Web服務兼容性,高級C# 2.0編程,Web服務安全性和Web服務事務等。
一、ASP.NET 2.0憑證基礎結構
基于互聯網的應用程序常常不依賴Windows帳戶和組,而是依賴于基于表單的認證并結合某種如SQL Server的后臺定制憑證存儲。為了幫助開發者免除重復設計和構建這樣的解決方案,ASP.NET 2.0發行中加入了一個現成的安全憑證基礎結構。ASP.NET 2.0憑證存儲并不僅可用于ASP.NET應用程序,而且ASP.NET Web服務和Windows表單應用程序都能使用它來管理它們的用戶憑證。另外,Windows通訊基礎(編碼名為Indigo)服務也能被容易地設置來使用ASP.NET 2.0安全憑證存儲。
ASP.NET 2.0使用一提供者模型來訪問和管理憑證以避免把應用程序耦合到任何特定存儲上。在利用抽象提供者模型的優點的同時由程序員來開發這個應用程序。超級用戶負責選擇和管理特定的憑證存儲。圖1顯示出ASP.NET 2.0安全提供者的架構。
![]() 圖1.ASP.NET 2.0安全提供者模型 |
Membership Provider負責管理用戶,而Role Provider負責管理角色。在憑證存儲中,每個用戶或角色僅限于一應用程序之內。這樣就允許不同應用程序使用一樣的憑證存儲而不會與彼此的用戶名或角色相沖突。ASP.NET為SQL服務器、Windows和活動目錄(見圖1)等的憑證存儲提供支持。為了安裝SQL Server憑證數據庫,可以運行aspnet_regsql.exe程序,其位置是:
<WINDOWS>Microsoft.NETFramework<version>
這個安裝程序創建一個稱為aspnetdb的新數據庫-它包含一組應用程序的表、用戶、角色以及存取這些表的存儲過程。這個SQL Server數據庫是運用最新的安全技術經過精心設計的。另外,ASP.NET 2.0還提供一套相應于提供者的類(圖1)。
使用哪個提供者的信息被保存在應用程序的配置文件(App.Config或Web.Config)中。你幾乎不需要直接與特定的提供者進行交互;而是,存在兩個靜態助理類:Membership和Roles-它們負責從配置文件中讀取使用哪個提供者。默認的提供者(即當沒有指定提供者時)就是SQL Server。Membership類(列表1)允許你創建和刪除用戶,檢索關于用戶的信息并觀看口令策略。
列表1: Membership助理類
[Serializable] public class MembershipUser{ public virtual bool ChangePassword(string oldPassword,string newPassword); public virtual string GetPassword(string passwordAnswer); public virtual string ResetPassword(string passwordAnswer); public virtual bool UnlockUser(); //其它成員 } public static class Membership{ public static string ApplicationName{get;set;} public static MembershipUser CreateUser(string username, string password); public static MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, out MembershipCreateStatus status); public static bool DeleteUser(string username,bool deleteAllRelatedData); public static MembershipUser GetUser(string username); public static void UpdateUser(MembershipUser user); public static bool ValidateUser(string username,string password); public static bool EnablePasswordReset{get;} public static bool EnablePasswordRetrieval{get;} //其它成員 } |
例如,為了在"MyApp"應用程序中創建一新用戶,你僅需如下編碼:
Membership.ApplicationName = "MyApp"; Membership.CreateUser("MyUser","MyPassword",...); |
Roles類允許你創建和刪除用戶角色,從角色中添加或刪除用戶,檢索用戶的角色會員信息以及驗證角色會員。下面是該類的定義:
public static class Roles{ public static string ApplicationName{get;set;} public static void CreateRole(string roleName); public static bool DeleteRole(string roleName, bool throwOnPopulatedRole); public static void AddUserToRole(string username, string roleName); public static void RemoveUserFromRole(string username, string roleName); public static string[] GetAllRoles(); public static string[] GetRolesForUser(string username); public static string[] GetUsersInRole(string roleName); public static bool IsUserInRole(string username, string roleName); //其它成員 } |
例如,要把角色"Manager"添加到應用程序"MyApp"上,你可以如下編碼:
Roles.ApplicationName = "MyApp"; Roles.CreateRole("Manager"); |
二、管理憑證存儲
如果你選擇使用Windows或活動目錄來存儲你的應用程序的用戶和角色,那么你需要使用相應于這些存儲的工具來管理,例如計算機控制面板小程序或活動目錄工具。其實,真正的問題在于如何管理存儲在SQL Server中的憑證。為此,你可以使用Visual Studio 2005和一個Web瀏覽器,甚至不需要安裝IIS。在一ASP.NET Web工程中,從"Website"菜單下選擇"ASP.NET配置"。這將使得Visual Studio宿主一個Web服務器,打開一可用的端口并且導航到一套管理頁面(見圖2)。這些管理頁面修改該Web應用程序配置文件并且也可以管理憑證存儲(當不選擇Windows認證時)。當使用Visual Studio 2005時,你首先需要選擇認證類型。你可以選擇Windows或表單認證(互聯網存取)。如果你選擇表單認證,你還可以執行下列操作:
·啟動或取消基于角色的安全
·創建和刪除角色
·創建和刪除用戶
·檢索一用戶的細節
·設置一用戶的狀態
·給用戶賦于某角色
·從角色中刪除用戶
![]() 圖2.ASP.NET Web應用程序管理頁面 |
既然SQL Server是ASP.NET 2.0提供的唯一的企業級定制憑證存儲,你可以單獨使用Visual Studio 2005驅動的管理頁面來管理aspnetdb數據庫,而不用任何其它存儲。
三、內置功能的不足
對于Visual Studio 2005驅動的管理頁面存在一些重要缺點:第一,你需要Visual Studio 2005。應用程序或系統超級用戶可能沒有Visual Studio 2005,更不用說如何使用它了。缺省地,該管理頁面使用一斜杠(/)來管理應用程序命名,并且沒提供任何修改方法。第二,不可能存在遠程存取-應用程序和Visual Studio 2005必須共存,這樣Visual Studio 2005才能存取應用程序的配置文件。第三,基于瀏覽器的用戶接口也不很友好-你需要不斷點擊Back按鈕,而且用戶接口反映相當遲鈍。另外,許多超級用戶可能想使用的特征無法經由頁面管理來實現,這就脫離了底層提供者類所支持的特性這一事實。這種方式還不能實現的方面有:
·更新大多數用戶帳戶細節
·檢索、改變、重置一用戶的口令
·檢索當前在線用戶數目信息
·能夠從一次操作的一個角色中刪除全部用戶
·檢索關于口令管理策略(例如長度、重置策略、口令類型等)的信息
·測試用戶憑證
·驗證用戶角色身份
而且,還有其它的超級用戶可能想要的特征也得不到支持。這些特征包括能夠檢索數據庫所有應用程序列表,能夠從一應用程序中刪除所有的用戶,能夠從一應用程序中刪除所有的角色,能夠刪除一應用程序(和它的所有相聯系的用戶和角色),能夠刪除所有的應用程序。總之,盡管ASP.NET 2.0提供了一個第一流的全面的憑證管理,然而它僅提供了一些原始的管理選項,一般的實際超級用戶是不會使用它的。
![]() 圖3.憑證管理器應用程序的一個快照 |
這一切促使我自己來開發一個定制的客戶端憑證管理器應用程序來彌補這些不足。圖3顯示該程序的一個快照。后面的部分將介紹我是如何設計和構建該憑證管理器的。