- .NET Web高級開發
- 羅江華 朱永光編著
- 2036字
- 2018-12-29 13:19:40
1.1.1 成員身份服務
ASP.NET 2.0中新增的最佳功能之一就是成員身份服務,屬于ASP.NET提供程序模型的基礎結構之一。所以有必要了解一下ASP.NET提供程序模型,它是ASP.NET 2.0推出的最有吸引力的特征之一,基于通用的面向對象方式(繼承,多態),并可以實現無限擴展。其本身也應用了幾個典型的設計模式(策略模式、適配器模式、工廠模式)。雖然ASP.NET和Microsoft Windows Forms都依賴于提供程序,但是它們不屬于相同的領域,前者在成員資格和個性化等關鍵服務中采用了提供程序模型,后者則僅用該模型存儲用戶和應用程序設置,本節后面會加以更多的闡述。對于成員身份服務,它提供了用于創建和管理用戶賬戶的易于使用的API。除了用戶的憑據驗證和管理,還提供了有關密碼的高級服務,可以自由定制密碼的最小長度,必須滿足大小寫標點的格式,同時還提供啟用或禁用密碼的檢索服務,將其綁定到問答模式上來。讀者應該知道在ASP.NET 1.x中大規模引入了窗體身份驗證,但仍然要求你編寫相當數量的代碼來執行實際操作中的窗體身份驗證。成員身份服務填補了ASP.NET 1.x窗體身份驗證服務的不足,并且使實現窗體身份驗證變得比以前簡單得多。
成員身份API通過兩個新的類來實現:Membership和MembershipUser,它們是一對配合得很好的搭檔。前者包含了用于創建用戶、驗證用戶以及完成其他工作(找回一個membershipUser實例,更新一個membershipUser實例,通過不同條件尋找一個用戶,獲得當前在線用戶數量,刪除一個已經不再需要的賬戶)的靜態方法。MembershipUser代表單個用戶,它包含了用于檢索和更改密碼、獲取上次登錄日期以及完成類似工作的方法和屬性。
下面以一個具體的例子來闡述Membership的使用方法:本例以Membership的CreateUser方法創建一個用戶。
首先要配置數據庫以方便我們把數據存儲在里面,以Windows XP SP2操作系統和SQL Server 2000數據庫為例。
① 注冊數據庫
打開:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet regsql.exe請根據您自己的系統選擇相應路徑,如圖1-1所示。

圖1-1
② 單擊“下一步”按鈕,選擇要執行的數據庫任務,如圖1-2所示。

圖1-2
③ 單擊“下一步”按鈕,選擇服務器和數據庫,如圖1-3所示。

圖1-3
④ 單擊“下一步”按鈕,確認注冊信息正確,如圖1-4所示。

圖1-4
⑤ 這一步驟完成后,ASP.NET將會在你設置的數據庫中生成相應的表和一些存儲過程,如圖1-5所示。

圖1-5
⑥ 到這一步數據庫的注冊已經完成,接下來要做的就是更改IIS中的配置選項,打開默認網站的屬性控制面板,查看ASP.NET選項卡,如圖1-6所示。

圖1-6
⑦ 編輯配置并編輯數據庫連接字符串,連接到上面設置的數據庫上,如圖1-7所示。

圖1-7
⑧ 在新建的項目文件頁面中定義如圖1-8所示的表格。

圖1-8
⑨創建用戶事件,代碼如下:
protected void btnCreate_Click(object sender, EventArgs e) { string userName = txtUserId.Text.Trim(); string pwd = txtPassword.Text.Trim(); string email = txtEmail.Text.Trim(); string question = ddlQuestion.SelectedValue.ToString(); string answer = txtAnswer.Text.Trim(); MembershipCreateStatus status; Membership.CreateUser(userName, pwd, email, question, answer, true, out status); switch (status) { case MembershipCreateStatus.Success: Response.Write("操作成功"); break; default: Response.Write("操作失敗"); break; } }
至此一個Membership的簡單例子演示完畢。有開發經驗的讀者可能已經發現問題的所在了,由于框架本身提供的功能有限。如Membership的CreateUser方法只提供了三個重載方法,在創建一個用戶時可能需要獲取用戶的更多信息,如姓名、性別、地址、職稱等。還有上面的數據庫是SQL Server2000而不是默認的SQL Server 2005 Express數據庫,怎么辦?這時我們可以采用前面討論的特性來解決:提供程序模型。與上面問題有關的是MembershipProvider。提供程序模型中還包括很多其他提供程序:PersonalizationProvider、ProfileProvider、RoleProvider、SiteMapProvider、WebEventProvider等。
提供程序模型的概念建立在繼承ProviderBase類的基礎之上,ProviderBase類是System.Configuration程序集的System.Configuration.Provider命名空間中的新類,它是一個抽象類,對于ASP.NET 2.0支持的任何服務,所有提供程序都會派生自這樣一個公共基類,為提供程序的實現者繼承。這個類非常簡單,只提供了幾個在大多數提供程序中都有用的方法和屬性,如表1-1所示。
表1-1 提供程序類

提供程序類的層次結構圖如圖1-9所示。

圖1-9
了解了上面的知識,我們就可以從擴展內置的提供程序入手來實現那些不能很好滿足我們需求的功能了。最簡單的一種方法是繼承一個內置的實現方式,例如SqlMembership Provider。這么做有幾個原因,但這里要說明的是如何驗證當前登錄的特定用戶。為此,我們將繼承一個內置提供程序,重寫ValidateUser方法,來實現時間限制功能。
首先需要創建一個類,使它繼承已有的SqlMembershipProvider,所在的命名空間為System. Web.Security.SqlMembershipProvider;然后在配置文件中配置新的提供程序,把defaultProvider的值改為以繼承為SqlMembershipProvider類的名稱;其次是檢查提供程序的配置,以確保程序的正確性。打開Web Site Administration Tool(選擇Visual Studio 2005 WebSite菜單,再選擇ASP.NET Configuration選項),進入Provider選項卡,就會發現,新建的提供程序現在已經是一個可選的成員提供程序。最后就是對我們的方法進行重寫了。
public override bool ValidateUser(string username,string password) { if((username!="kim")&&(password!="P@ssw0rd123 ")) return false; return base.ValidateUser(username, password); }
當然我們還可以直接建立自己的成員提供程序,來實現一個定制類,以履行提供程序的契約。這么做的一個主要原因是,例如,成員提供程序默認為ASP.NET成員服務的一個接口,它把數據存儲在數據庫的專用ASP.NET表中,許多已有的應用程序都有成員表的概念,而替換它們來利用某些使用成員提供程序的內置控件,其工作量很大。但是,當我們創建一個執行MembershipProvider類的重要方法的類時,就可以讓定制類對已有的數據庫執行成員操作。這類定制并不限于對數據庫執行操作,還可以從定制類中調用第三方供應商的API。實現方式很簡單,直接繼承MembershipProvider類即可,具體實現思路和上面的例子一樣。
雖然這是一些相當簡單的例子,但卻說明了如何利用內置提供程序來滿足應用程序需要的附加業務要求,同時不需要重新實現已提供的全部功能。