閱讀提要 在缺省狀況下,你只能使用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;}
//其它成員
}