asp.net|安全 閱讀提要 在預設狀況下,你只能使用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安全提供者的架構。
圖1.ASP.NET 2.0安全提供者模型
Membership Provider負責系統管理使用者,而Role Provider負責管理角色。在憑證儲存中,每個使用者或角色僅限於一應用程式之內。這樣就允許不同應用程式使用一樣的憑證儲存而不會與彼此的使用者名稱或角色相衝突。ASP.NET為SQL伺服器、Windows和活動目錄(見圖1)等的憑證儲存提供支援。為了安裝SQL Server憑證資料庫,可以運行aspnet_regsql.exe程式,其位置是:
<WINDOWS>\Microsoft.NET\Framework\<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顯示該程式的一個快照。後面的部分將介紹我是如何設計和構建該憑證管理器的。