|
系列文章導(dǎo)航:
WCF版的PetShop之一:PetShop簡(jiǎn)介
WCF版的PetShop之三:實(shí)現(xiàn)分布式的Membership和上下文傳遞
通過(guò)上一篇了解了模塊內(nèi)基本的層次劃分之后,接下來(lái)我們來(lái)聊聊PetShop中一些基本基礎(chǔ)功能的實(shí)現(xiàn),以及一些設(shè)計(jì)、架構(gòu)上的應(yīng)用如何同WCF進(jìn)行集成。本篇討論兩個(gè)問(wèn)題:實(shí)現(xiàn)分布式的Membership和客戶(hù)端到服務(wù)端上下文(Context)的傳遞。
一、 如何實(shí)現(xiàn)用戶(hù)驗(yàn)證
對(duì)登錄用戶(hù)的驗(yàn)證是大部分應(yīng)用所必需的,對(duì)于ASP.NET來(lái)說(shuō),用戶(hù)驗(yàn)證及帳號(hào)管理實(shí)現(xiàn)在成員資格(Membership)模塊中。同ASP.NET的其他模塊一樣,微軟在設(shè)計(jì)Membership的時(shí)候,為了實(shí)現(xiàn)更好地可擴(kuò)展性,采用了策略(Strategy)設(shè)計(jì)模式:將模塊相關(guān)的功能定義在被稱(chēng)為Provider的抽象類(lèi)型中,并通過(guò)繼承它提供具體的Provider。如果這些原生的Provider不能滿(mǎn)足你的需求,你也可以通過(guò)繼承該抽象的Provider,創(chuàng)建自定義的Provider。通過(guò)ASP.NET提供的配置,你可以很輕易地把自定義的Provider應(yīng)用到你的應(yīng)用之中。在一般情況下,最終的編程人員并不通過(guò)Provider調(diào)用相關(guān)的功能,而是通過(guò)一個(gè)外觀(Facade)類(lèi)實(shí)現(xiàn)對(duì)相關(guān)功能的調(diào)用。
ASP.NET成員資格模塊的設(shè)計(jì)基本上可以通過(guò)下面的類(lèi)圖1反映出來(lái):最終的編程人員通過(guò)外觀類(lèi)型(Façade Class)Membership調(diào)用成員資格相關(guān)的功能,比如用戶(hù)認(rèn)證、用戶(hù)注冊(cè)、修改密碼等;Membership通過(guò)抽象類(lèi)MembershipProvider提供所有的功能,至于最終的實(shí)現(xiàn),則定義在一個(gè)個(gè)具體的MembershipProvider中。基于成員資格信息不同的存儲(chǔ)方式,ASP.NET提供了兩個(gè)原生的MembershipProvider:SqlMembershipProvider和ActiveDirectoryMembershipProvider,前者基于SQL Server數(shù)據(jù)庫(kù),后者基于AD。如果這兩個(gè)MembershipProvider均不能滿(mǎn)足需求,我們還可以自定義MembershipProvider。
圖1 ASP.NET Membership 設(shè)計(jì)原理
我們的案例并不會(huì)部署于AD之中,所以不能使用ActiveDirectoryMembershipProvider;直接通過(guò)Web服務(wù)器進(jìn)行數(shù)據(jù)庫(kù)的存取又不符合上述物理部署的要求(通過(guò)應(yīng)用服務(wù)器進(jìn)行數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)),所以SqlMembershipProvider也不能為我們所用。為此需要自定義MembershipProvider,通過(guò)WCF服務(wù)調(diào)用的形式提供成員資格所有功能的實(shí)現(xiàn)。我們將該自定義MembershipProvider稱(chēng)為RemoteMembershipProvider。圖2揭示了RemoteMembershipProvider實(shí)現(xiàn)的原理:RemoteMembershipProvider通過(guò)調(diào)用WCF服務(wù)MembershipService提供對(duì)成員資格所有功能的實(shí)現(xiàn);MembershipService則通過(guò)調(diào)用Membership實(shí)現(xiàn)服務(wù);最終的實(shí)現(xiàn)還是落在了SqlMembershipProvider這個(gè)原生的MembershipProvider上。
圖2 RemoteMembershipProvider實(shí)現(xiàn)原理
1、服務(wù)契約和服務(wù)實(shí)現(xiàn)
首先來(lái)看看MembershipService實(shí)現(xiàn)的服務(wù)契約的定義。由于MembershipService最終是為RemoteMembershipProvider這個(gè)自定義MembershipProvider服務(wù)的,所以服務(wù)操作的定義是基于MembershipProvider的API定義。MembershipProvider包含兩種類(lèi)型的成員:屬性和方法,簡(jiǎn)單起見(jiàn),我們可以為MembershipProvider每一個(gè)抽象方法定義一個(gè)匹配的服務(wù)操作;而對(duì)于所有屬性,完全采用服務(wù)端(應(yīng)用服務(wù)器)的MembershipProvider相關(guān)屬性。在RemoteMembershipProvider初始化的時(shí)候通過(guò)調(diào)用MembershipService獲取所有服務(wù)端MembershipProvider的配置信息。為此,我們?yōu)镸embershipProvider的所有屬性定義了一個(gè)數(shù)據(jù)契約:MembershipConfigData。在PetShop中,MembershipConfigData和服務(wù)契約一起定義在Infrastructures.Service.Interface項(xiàng)目中。
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技術(shù):WCF版的PetShop之三:實(shí)現(xiàn)分布式的Membership和上下文傳遞,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。