明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

ASP.NET2.0應用中定制安全憑證之實戰(zhàn)篇

[摘要]一、方案架構(gòu)   本方案架構(gòu)很簡單——它用一個Web服務來包裝ASP.NET 2.0提供者并且為遠程客戶暴露該憑證管理,你甚至還能在該架構(gòu)中加上一些失去的功能。然后,在提供一個豐富的用戶接口和全面憑證管理經(jīng)驗的同時,使用一個Windows表單應用程序來消費該Web服務。該Web服務配置文件將包含特...
一、方案架構(gòu)

  本方案架構(gòu)很簡單——它用一個Web服務來包裝ASP.NET 2.0提供者并且為遠程客戶暴露該憑證管理,你甚至還能在該架構(gòu)中加上一些失去的功能。然后,在提供一個豐富的用戶接口和全面憑證管理經(jīng)驗的同時,使用一個Windows表單應用程序來消費該Web服務。該Web服務配置文件將包含特定于該憑證存儲的指令。然而,這的確意味著所有由該Web服務管理的應用程序都將可以共享這些指令。

  盡管你能夠從頭到尾地構(gòu)建該Web服務,也就是說,首先用靜態(tài)方法Roles和Membership來包裝它們并定義該Web服務,我卻更喜歡一種契約驅(qū)動的方法:首先設計執(zhí)行各種操作的最好接口將是什么,并且直到需要時才考慮怎樣實現(xiàn)它們。這樣做可以確保由Web服務暴露的接口支持所有要求的管理功能并且還將減少該客戶應用程序與任何實現(xiàn)細節(jié)(例如包裝提供者)之間的耦合。

  ASP.NET 2.0的一個更好的特點是它支持Web服務接口,你可以定義并且讓該Web服務暴露邏輯接口,就象類的表現(xiàn)一樣。為此,你需要用WebServiceBinding屬性修飾你的接口并且經(jīng)由WebMethod屬性來暴露單個的接口方法。然后,你將有一個派生于這個接口的類并實現(xiàn)該接口,而且編譯器將要求你支持該接口的所有方法。

  為了管理和交互于憑證存儲和Web服務配置,我定義了5個接口-IApplicationManager,IMembershipManager,IPasswordManager,IroleManager和IUserManager。

  (一) IApplicationManager

  該IApplicationManager接口顯示于所附源碼中的列表2,允許管理員刪除一指定的應用程序-也就是說,從數(shù)據(jù)庫中刪除所有到它的參考并且刪除它的所有用戶和角色。IApplicationManager允許從存儲中刪除所有的應用程序,并且它能返回在該存儲中的所有應用程序的一個列表。注意,這個接口作為一個內(nèi)部的接口被定義-public或internal可見性修飾詞對Web服務接口都是無意義的。該接口上的每個方法用WebMethod屬性加以修飾并有一個該方法的簡短描述。此外,存取憑證存儲的所有方法都被設置為使用事務處理。這樣以來,兩種操作-如刪除一應用程序和創(chuàng)建一用戶將在彼此完全隔離的情況下執(zhí)行,從而保證了如刪除所有用戶等復雜操作的原子性。.NET 2.0中的Web服務只能啟動一個新事務,而且它是由WebMethod屬性的TransactionOption屬性來控制的。最后一點是把WebServiceBinding屬性應用于接口上。這就指定該接口是一個客戶和服務都能綁定到的Web服務接口。為了把該接口以一個WSDL契約方式暴露給外界,你需要使用一個shim類。這個shim類的設計是必要的,因為你不能把一個接口作為一Web服務暴露,而且你也不能在其上應用WebService屬性。這個shim類還將經(jīng)由WebService屬性為該接口命名空間定義。下面的代碼顯示了IApplicationManagerShim抽象類的定義。

[WebService(Name="IApplicationManager",
Namespace="http://CredentialsServices",
Description="IApplicationManager is used to manage 
applications. This web service is only 
the definition of the interface. You 
cannot invoke method calls on it.")]
abstract class IApplicationManagerShim : IApplicationManager{
 public abstract void DeleteApplication(string application);
 public abstract string[] GetApplications();
 public abstract void DeleteAllApplications();

  因為IApplicationManagerShim是一個類,所以你可以把它暴露為一個Web服務。因為它是一抽象類且所有方法被定義為抽象方法,所以不需要(也不能)實現(xiàn)任何方法。為了使其看起來就象該接口,IapplicationManagerShim把WebService屬性的屬性名設置為IApplicationManager(代替缺省的類名)。現(xiàn)在,你可以使用IApplicationManager.asmx文件來暴露該接口。 

<%@ WebService Language="C#" 
CodeBehind="~/App_Code/IApplicationManagerShim.cs"
Class="IApplicationManagerShim"%>
  現(xiàn)在,如果你瀏覽到IApplicationManager.asmx頁面,你就會看到該接口定義。你可以使用WSDL.exe的serverInterface選項來把接口定義輸入到客戶端或任何其它想綁定到該接口定義上的服務。

  (二) IMembershipManager

  IMembershipManager接口(見所附源碼中的列表3)允許你管理用戶帳戶的所有方面-創(chuàng)建和刪除用戶帳戶,更新用戶帳戶,檢索用戶帳戶細節(jié)以及檢索在一應用程序中的所有用戶。

  (三) IRoleManager

  IRoleManager接口允許你管理邏輯角色的所有方面-創(chuàng)建和刪除角色,從角色中增加和刪除用戶以及檢索在一應用程序中的所有角色。

[WebServiceBinding("IRoleManager")]
interface IRoleManager{
[WebMethod(...)]
void CreateRole(string application,string role);
[WebMethod(...)]
bool DeleteRole(string application,string role,bool throwOnPopulatedRole);
[WebMethod(...)]
void AddUserToRole(string application,string userName, string role);
[WebMethod(...)]
void DeleteAllRoles(string application,bool throwOnPopulatedRole);
[WebMethod(...)]
string[] GetAllRoles(string application);
[WebMethod(...)]
string[] GetRolesForUser(string application,string userName);
[WebMethod(...)]
string[] GetUsersInRole(string application, string role);
[WebMethod(...)]
void RemoveUserFromRole(string application,string userName, string roleName);
//更多成員
}
  (四) IPasswordManager

  這個IPasswordManager接口主要提供與應用程序口令策略相關(guān)的只讀信息。

[WebServiceBinding("IPasswordManager")]
interface IPasswordManager{
[WebMethod(...)]
bool EnablePasswordReset(string application);
[WebMethod(...)]
bool EnablePasswordRetrieval(string application);
[WebMethod(...)]
string GeneratePassword(string application,int length,
int numberOfNonAlphanumericCharacters);
[WebMethod(...)]
bool RequiresQuestionAndAnswer(string application);
[WebMethod(...)]
string ResetPassword(string application,string userName);
[WebMethod(...)]
string GetPassword(string application,string userName,string passwordAnswer);
[WebMethod(...)]
void ChangePassword(string application,string userName,string newPassword);
//更多成員

  典型地,該策略存儲在應用程序的配置文件中。該策略包括是否啟動口令重置和檢索,口令強度和口令回答策略等。你也可以使用IpasswordManager來生成一相應于該口令強度策略的新口令。另外,IpasswordManager可用于重置、改變或檢索一指定用戶的口令。

  (五) IUserManager

  IUserManager接口允許校驗用戶憑證,檢索角色身份以及獲取指定用戶是其成員之一的所有角色。該接口用于測試和分析目的。 

[WebServiceBinding("IUserManager")]
public interface IUserManager{
[WebMethod(...)]
bool Authenticate(string applicationName,string userName, string password);
[WebMethod(...)]
bool IsInRole(string applicationName,string userName, string role);
[WebMethod(...)]
string[] GetRoles(string applicationName,string userName);
}

[1] [2] [3]  下一頁