|
系列文章導航:
WCF版的PetShop之三:實現分布式的Membership和上下文傳遞
通過上一篇了解了模塊內基本的層次劃分之后,接下來我們來聊聊PetShop中一些基本基礎功能的實現,以及一些設計、架構上的應用如何同WCF進行集成。本篇討論兩個問題:實現分布式的Membership和客戶端到服務端上下文(Context)的傳遞。
一、 如何實現用戶驗證
對登錄用戶的驗證是大部分應用所必需的,對于ASP.NET來說,用戶驗證及帳號管理實現在成員資格(Membership)模塊中。同ASP.NET的其他模塊一樣,微軟在設計Membership的時候,為了實現更好地可擴展性,采用了策略(Strategy)設計模式:將模塊相關的功能定義在被稱為Provider的抽象類型中,并通過繼承它提供具體的Provider。如果這些原生的Provider不能滿足你的需求,你也可以通過繼承該抽象的Provider,創建自定義的Provider。通過ASP.NET提供的配置,你可以很輕易地把自定義的Provider應用到你的應用之中。在一般情況下,最終的編程人員并不通過Provider調用相關的功能,而是通過一個外觀(Facade)類實現對相關功能的調用。
ASP.NET成員資格模塊的設計基本上可以通過下面的類圖1反映出來:最終的編程人員通過外觀類型(Façade Class)Membership調用成員資格相關的功能,比如用戶認證、用戶注冊、修改密碼等;Membership通過抽象類MembershipProvider提供所有的功能,至于最終的實現,則定義在一個個具體的MembershipProvider中。基于成員資格信息不同的存儲方式,ASP.NET提供了兩個原生的MembershipProvider:SqlMembershipProvider和ActiveDirectoryMembershipProvider,前者基于SQL Server數據庫,后者基于AD。如果這兩個MembershipProvider均不能滿足需求,我們還可以自定義MembershipProvider。
我們的案例并不會部署于AD之中,所以不能使用ActiveDirectoryMembershipProvider;直接通過Web服務器進行數據庫的存取又不符合上述物理部署的要求(通過應用服務器進行數據庫訪問),所以SqlMembershipProvider也不能為我們所用。為此需要自定義MembershipProvider,通過WCF服務調用的形式提供成員資格所有功能的實現。我們將該自定義MembershipProvider稱為RemoteMembershipProvider。圖2揭示了RemoteMembershipProvider實現的原理:RemoteMembershipProvider通過調用WCF服務MembershipService提供對成員資格所有功能的實現;MembershipService則通過調用Membership實現服務;最終的實現還是落在了SqlMembershipProvider這個原生的MembershipProvider上。
圖2 RemoteMembershipProvider實現原理
1、服務契約和服務實現
首先來看看MembershipService實現的服務契約的定義。由于MembershipService最終是為RemoteMembershipProvider這個自定義MembershipProvider服務的,所以服務操作的定義是基于MembershipProvider的API定義。MembershipProvider包含兩種類型的成員:屬性和方法,簡單起見,我們可以為MembershipProvider每一個抽象方法定義一個匹配的服務操作;而對于所有屬性,完全采用服務端(應用服務器)的MembershipProvider相關屬性。在RemoteMembershipProvider初始化的時候通過調用MembershipService獲取所有服務端MembershipProvider的配置信息。為此,我們為MembershipProvider的所有屬性定義了一個數據契約:MembershipConfigData。在PetShop中,MembershipConfigData和服務契約一起定義在Infrastructures.Service.Interface項目中。
1: using System.Runtime.Serialization;
2: using System.Web.Security;
3: namespace Artech.PetShop.Infrastructures.Service.Interface
4: {
5: [DataContract(Namespace = "http://www.artech.com/")]
6: public class MembershipConfigData
7: {
8: [DataMember]
9: public string ApplicationName
10: { get; set; }
11:
12: [DataMember]
13: public bool EnablePasswordReset
14: { get; set; }
15:
16: [DataMember]
17: public bool EnablePasswordRetrieval
18: { get; set; }
19:
20: [DataMember]
21: public int MaxInvalidPasswordAttempts
22: { get; set; }
23:
24: [DataMember]
25: public int MinRequiredNonAlphanumericCharacters
26: { get; set; }
27:
28: [DataMember]
29: public int MinRequiredPasswordLength
30: { get; set; }
31:
32: [DataMember]
33: public int PasswordAttemptWindow
34: { get; set; }
35:
36: [DataMember]
37: public MembershipPasswordFormat PasswordFormat
38: { get; set; }
39:
40: [DataMember]
41: public string PasswordStrengthRegularExpression
42: { get; set; }
43:
44: [DataMember]
45: public bool RequiresQuestionAndAnswer
46: { get; set; }
47:
48: [DataMember]
49: public bool RequiresUniqueEmail
50: { get; set; }
51: }
52: }
NET技術:WCF版的PetShop之三:實現分布式的Membership和上下文傳遞,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。