明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

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

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

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

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

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

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

  (一) IApplicationManager

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

  因?yàn)镮ApplicationManagerShim是一個(gè)類,所以你可以把它暴露為一個(gè)Web服務(wù)。因?yàn)樗且怀橄箢惽宜蟹椒ū欢x為抽象方法,所以不需要(也不能)實(shí)現(xiàn)任何方法。為了使其看起來(lái)就象該接口,IapplicationManagerShim把WebService屬性的屬性名設(shè)置為IApplicationManager(代替缺省的類名),F(xiàn)在,你可以使用IApplicationManager.asmx文件來(lái)暴露該接口。 

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

  (二) IMembershipManager

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

  (三) IRoleManager

  IRoleManager接口允許你管理邏輯角色的所有方面-創(chuàng)建和刪除角色,從角色中增加和刪除用戶以及檢索在一應(yī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

  這個(gè)IPasswordManager接口主要提供與應(yīng)用程序口令策略相關(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);
//更多成員

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

  (五) IUserManager

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

[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]  下一頁(yè)