在 ASP.NET Whidbey 中,一个基本的目标是,在开发应用程序时,减少开发时间和代码量。为了达到这一目的, ASP.NET Whidbey 提供了一系列的新特征,例如无需代码的数据绑定,新的服务器端控件,尤其是,在这篇文章中要重点讨论的个人化( personalization )和成员角色 (membership) ,来节省你的时间。
伴随着个人化和成员角色这两个新特征,第一步是要配置你用来存储个人化( personalization )和成员角色 (membership) 数据的提供者( provider )。虽然你可以自己创建 Access 或 SQL Server 数据库,手动添加必要的配置元素,更简单的方法是使用 ASP.NET Web Site Administration tool ,如图一。
图一
请注意,要成功的配置一个应用程序,你必须使用一个具有管理员权限的账号来登录。
要创建一个 Access 的 .mdb 文件来储存 personalization 的数据,你需要打开 ASP.NET Web Site Administration tool 。在一个叫 DATA 的文件夹下,会自动创建一个 AspNetDB.mdb 的文件。
图二
要配置 membership 的 provider ,你需要使用 ASP.NET Web Site Administration tool 的 Security 标签。最简单的方法是选择使用向导,如图三。
图三
在此刻, membership 的数据库会被创建,必须的配置元素也会被加入到 web.config 文件中。你需要做的,只是把所有用户加入到数据库,设置限制的页,以及创建一个 login 页面。
很重要的一点是,你可以注意到,为 personalization 和 membership 创建的数据库是相同的,所以你可以使用同样的 provider 。
除了内嵌的 Access 和 SQL Server 的 providers ,你可以创建自己定制的 providers ,然后使用这些 providers 来配置应用程序。也就是说,你如果有了一个以前的数据库,还是可以使用 membership 服务。
上面的都是理论方面的,接着我们来看一下实例。我会为各位读者展示使用 Access provider 来配置 personalization 和 membership ,在 membership 数据库中添加一个用户,添加 personalization 的属性,在一个页面中使用这些属性,分别是匿名用户和已登录的用户。
首先要创建一个 Web 站点,然后点击 Solution Explorer 窗口下的 ** Web Site Administration tool ** 按钮。(见图二)
接着,点 ** Security ** 标签,选择 ** Security Setup Wizard ** 单选钮,并点 ** Next ** 。第一步是很简单的信息,所以读一下,就可以选 ** Next ** 。第二步,选择 ** From the Internet ** 然后点 ** Next ** 。 "From the Internet" 是使用 ASP.NET 窗体验证来配置应用程序, "From a local area network" 使用 Windows 验证来配置应用程序。第三步,点 ** Next ** 来使用 Web Site Administration tool 已经自动创建的 AspNetDB.mdb 文件。接着点 ** Next ** 跳过第四步。在第五步,因为有测试的目的,至少要加上一个用户。第六步是创建访问规则。最后,按 ** Finish ** 退出向导。数据库已经建立, web.config 文件也被自动创建,加入了 Web 站点,里面包含了各种元素,文件如下:
1<configuration>
2<connectionstrings>
3<add connectionstring="c:\inetpub\wwwroot\aspnetPRO_PM\DATA\AspNetDB.mdb" name="webAdminConnection631974613823397072"></add>
4</connectionstrings>
5<system.web>
6<membership defaultprovider="AspNetDB">
7<providers>
8<add applicationname="/aspnetPRO_PM" connectionstringname="webAdminConnection631974613823397072" enablepasswordreset="true" enablepasswordretrieval="true" name="AspNetDB" passwordformat="Encrypted" requiresquestionandanswer="true" type="System.Web.Security.AccessMembershipProvider,
9
10System.Web, Version=1.1.3300.0, Culture=neutral,
11
12PublicKeyToken=b03f5f7f11d50a3a"></add>
13</providers>
14</membership>
15<rolemanager defaultprovider="AspNetDB">
16<providers>
17<add applicationname="/aspnetPRO_PM" connectionstringname="webAdminConnection631974613823397072" name="AspNetDB" type="System.Web.Security.AccessRoleProvider,
18
19System.Web, Version=1.1.3300.0, Culture=neutral,
20
21PublicKeyToken=b03f5f7f11d50a3a"></add>
22</providers>
23</rolemanager>
24<authentication mode="Forms"></authentication>
25</system.web>
26</configuration>
如果要允许匿名用户访问你的站点, `
1<anonymousidentification> ` ` 元素是必需的。 ` personalization ` 部分包含两个属性,第一个属性, ` ` theme ` ` ,并不指定一个类型,所以可以当作一个字符串对待。第二个属性, ` FavoriteColors ,指定了 StringCollection 类作为它的类型。在这个属性中,如果想要存储不兼容 StringCollection 类的数据,都会抛出异常。
2
3<anonymousidentification enabled="true"></anonymousidentification>
4<personalization>
5<profile>
6<property allowanonymous="true" name="Theme"></property>
7<property allowanonymous="true" name="FavoriteColors" serializeas="Xml" type="System.Collections.Specialized.StringCollection"></property>
8</profile>
9</personalization>
10
11现在,我们了解了配置 personalization 和定义一个 provider ,现在是时候研究如何定义构成用户 profile 的 value 集了。你需要为你想存储的每个 profile 值添加一个 ** <property> ** 条目。事实上,你可以存储任何种类的对象,简单类型,字符串,布尔类型,或是复杂一点的,比如 collections ,甚至是自定义的类型。
12
13<profile>
14<property name="MessagesPerPage" type="int"></property>
15</profile>
16
17personalization 系统支持更复杂的类型,例如 collections 。事实上,你可以存储任何序列化的对象。其实定义一个复杂的属性和定义一个简单的属性没有太大的差别。接下来的代码,包含了简单和复杂的属性的定义。
18
19<personalization defaultprovider="Access" enabled="true">
20<providers>
21<add connectionname="..." name="Access" type="... "></add>
22<add connectionname="..." name="SQL" type="... "></add>
23</providers>
24<profile>
25<property allowanonymous="false" name="EmailAddresses" provider="SQL" serializeas="Xml" type="System.Collection.Specialized.StringCollection"></property>
26<property defaultvalue="25" name="MessagesPerPage" type="int"></property>
27</profile>
28</personalization>
29
30定义好了用户的 profile 后,就可以开始进行编码。 ** Page ** 类包括一个 profile 属性,也是 ** HTTPPersonalizationBase ** 的子类。它有如下的成员列表:
31
32
33
34图四
35
36在 membership 特征中, ASP.NET Whidbey 提供了很多的安全控件,下面是一个列表:
37
38控件
39
40|
41
42功能
43
44---|---
45
46Login
47
48|
49
50为站点定制了所有的登录功能,不需要任何代码
51
52LoginView
53
54|
55
56可以选择几种不同的模板
57
58PasswordRecovery
59
60|
61
62“忘记密码”的控件,用选择问题和答案来验证用户身份
63
64LoginStatus
65
66|
67
68显示用户登录的状态
69
70LoginName
71
72|
73
74能将登录的用户显示到页面上
75
76我们举 PasswordRecovery 控件为例:在页面添加一个 PasswordRecovery 控件, HTML 代码如下:
77
78<form runat="server">
79<asp:passwordrecovery backcolor="#FFFFCC" bordercolor="#999999" borderstyle="Solid" borderwidth="1px" font-="" font-size="10pt" id="Passwordrecovery1" names="Verdana" runat="server" visible="true">
80<titletextstyle backcolor="#333399" font-bold="True" forecolor="#FFFFFF">
81</titletextstyle>
82</asp:passwordrecovery>
83</form>
84
85
86
87
88图五
89
90我们可以看出,新一代的 ASP.NET Whidbey ,控件已经做的非常完备,大大方便了程序员的开发效率,需要编写的代码越来越少了,让我们拭目以待吧!</property></anonymousidentification>