【Asp.net精品源码栏目提醒】:网学会员在Asp.net精品源码频道为大家收集整理了“【精品】ASP.NET2.0深入浅出4 - 其它资料“提供大家参考,希望对大家有所帮助!
ASP.NET 2.0 深入浅出 4 成员关系的概念在人类社会中是一个层次比较低的概念,源于希望属于某个群组的意识。
我们希望能觉得自己是某个团队的一部分,让别人知道我们是谁,因此 Web 搭上这个流行趋势,采用这个概念只是时间早晚的问题。
如果坐下来想一想曾经登录过多少个站点并在这些站点上保存了简单的用户信息, 可能会发现自己所属的群组比一开始想象的要多得多。
从出售书籍和小器具的站点到讨论拥有一辆 Ford Puma 的好处的社区,或者宣传一个名为 Look Around You 的 BBC TV喜剧节目的站点, 作者发现自己是会员的站点多得无法一一列举。
接下来就会碰到一个熟悉的困难“登录这个站点要使用哪个用户名和口令?” Web 上最成功的站点之一,Amazon.com,一开始只是一个书店,但后面经营的范围越来越大。
现在当用户登录 Amazon 时,将发现整个页面上全是与该用户的消费习惯有关的商品。
在本章中,您将学习怎样使用
ASP.NET 2.0 提供的成员关系功能实现站点的个性化。
本章讨论如下内容: ● 身份、验证和授权的概念 ● 成员关系服务器变量,包括 Login 控件 ● 保存成员配置文件以便取回 ● 在站点的特定部分实施访问限制,只运行特定的成员访问 ● 根据当前用户配置文件个性化站点 还将扩展 Wrox United 示例站点,以便能够登录该站点并根据一组保存起来的个人偏好个性化站点,这些信息是基于成员配置文件的。
4.1 安全基础知识 在开始开发涉及到成员关系的应用程序时,必须首先理解几个关键的概念,这些概念是身份、验证和授权。
4.1.1 身份——我是谁 在考虑身份时,我们可以用几种独一的特性来描述自己。
例如,我是一个头发金黄的女人,喜欢看科幻电影和组装 PC 机,但这些信息对于对我的羽毛球技术感兴趣的人来说并不是必需的。
保存在站点中的身份信息很可能只与一个人的某些方面相关。
例如,一个购物站点会保存用户的姓名、电话号码、电子邮件地址和家庭地址,这些信息都与商品的销售有关。
它们可能不会关心您的个人兴趣除非它们和 Amazon 的规模一样大,所以它们并不需要保存关于用户的这类信息,但是这并不妨碍它们拥有这些方面的身份信息。
因此身份,也就是我是谁的概念,是一组范围很广的实际情况的集合。
您可能曾经在简历里写下了很多实际情况,但这些情况同样只与潜在的雇主相关。
在简历中保存和删除哪些情况由自己决定。
在保存一个站点的成员的信息时,情况也是一样的,必须在开发阶段就确定要保存成员的哪些实际情况。
4.1.2 身份验证——这就是我 在试图登录一个网站的时候,用户要输入某些证书;例如,邮件地址及其口令的组合。
网站接下来必须判断用户是否就是自己声明的那个人,因此用户输入的邮件地址和口令的组合必须与保存在服务器文件中特定的邮件地址和口令组合相匹配。
身份验证的过程就是证明自己是自己所声明的那个人的过程。
很多站点,不论它们是零售商品还是提供社区服务,都使用邮件地址和口令的组合作为身份验证方法,这是一种经过反复考验的方法。
虽然这种方法不是绝对安全,但是只要选择一个足够可靠的口令并严格保密,同时站点的代码经过严格的测试,那么用户的配置文件将只能由用户本人使用。
4.1.3 授权——这是我能做的 在向网站输入用户名和口令之后,Web 服务器将不仅会验证口令和用户名是否匹配,还将查看站点管理员给用户授予了什么权限。
身份验证之后的下一个步骤是授权,这个步骤将检索您所拥有的用户账户类型的更多信息。
例如,以一个银行网站为例。
在用户的登录信息通过验证之后,服务器将查看用户在该站点上的权限。
与大多数用户一样,您可以查询账户、在账户之间转账或者支付账单。
然而,如果银行受到某个安全方面的恐吓类似于 Internet上到处流传的网络钓鱼phishing电子邮件,您可能会发现自己突然无法通过这个在线应用程序添加任何第三方代理订单,直到安全危机解除为止。
功能的关闭很可能是由管理员为一些或所有用户设置一个特殊的标记而进行控制的,在页面上告诉用户他们不再有权限修改他们账户的详细信息。
4.1.4 登录站点 登录站点的过程,从用户的角度看,就是输入一组证书,然后根据自己的配置文件看到不同用户界面的过程。
通常,用户所使用的证书是用户名加口令的组合;然而,对于安全性更高的站点,例如银行站点,可以使用其他的方式登录,包括 PIN 和安全认证。
如果不考虑向服务器传送身份验证证书的方法,那么身份验证的基本原则是一样的。
一旦验证完成之后,通过身份验证机制查询用户具有什么样的权限就比较简单了。
撇开理论,
ASP.NET 2.0 提供了一些非常强大的工具,可以帮助开发人员以最小的代价实现登录-身份验证-授权架构。
在旧版的
ASP.NET 中,开发人员必须编写代码实现登录、根据数据库进行验证并根据当前登录的用户做出响应。
虽然开发人员最终仍要编写代码对用户进行处理如本章后面的内容所示,但是一些强大的控件和向导已经把这个过程起始阶段的各种困难都解决了。
在这一节中,将进一步学习用于处理登录的服务器控件和
ASP.NET Web ApplicationConfiguration 实用工具。
4.2.1 Login 控件 在本小节中,首先将创建一个只有两个页面的简单模拟站点;Default.aspx是前台页面,login.aspx 是登录页面。
您将进行一系列的练习,然后暂停下来查看幕后发生的是什么。
在本章的后面,将把其中一些规则应用到 Wrox United站点以便把登录架构整合到这个应用程序中。
这一节介绍以下几个控件: ● Login 控件,该控件提供文本框、按钮和内建的身份验证功能,使开发人员通过简单的 拖放操作就可以向页面添加登录功能。
● LoginView 控件,该控件根据用户是否登录可以改变页面的外观,或者向不同群组的用 户显示不同的页面。
● LoginStatus 控件,该控件向用户显示反馈信息,提醒用户他们是否已经登录站点。
在下面的“试一试”练习中,将使用以上的一些控件。
这个示例通过创建页面并添加控件来搭建站点的骨架。
1 打开 VWD 并在 C:BegASPNET2ChaptersBegin 目录中创建一个空白的站点,将其命名为 Chapter04。
默认情况下,站点中应该已经包含了一个名为Default.aspx 的页面,如图 4-1 所示。
图 4-1 切换到 Design View, 2 再添加控件。
从工具箱的 Login 面板中将 LoginView控件拖放到页面上如图 4-2 所示。
在弹出的 Common Tasks 菜单中,确保选择Anonymous Template 并在主文本框中输入 You are not logged in。
图 4-2 3 通过单击该控件右上方的小箭头再次打开 Common Tasks 菜单并选择LoggedInTemplate,然后在文本框中输入 You are logged in。
这将确保页面提醒用户是否已经登录。
4 将一个 LoginStatus 控件拖放到页面上并放置在 LoginView 控件的下面,如图 4-3 所示。
这个控件将根据用户当前是否已经登录向用户显示一个登录或登出链接。
图 4-3 5 下一步要创建一个登录页面,因此在 Solution Explorer 中单击站点的根目录并选择 Add New Item。
在弹出的对话框中,选择 Web Form 并命名为Login.aspx,如图 4-4 所示。
图 4-4 6 在这个新创建的页面中,从工具箱的 Login 面板上拖放一个 Login 控件到该页面上,如图 4-5 所示。
7 在弹出的 Common Tasks 菜单中,可以管理站点。
到现在为止,整个架构已经搭建完毕,但在站点能够运行之前需要添加一些用户账户,因此请单击Common Tasks 菜单中的 Administer Website 链接启动
ASP.NET Web ApplicationConfiguration 工具,该工具将在下一个练习中介绍。
图 4-5 操作回顾 这些控件确实非常强大,虽然现在还不能运行这个示例,但是完全可以相信,只需再进行少量的处理,就可以获得一个能够试验登录功能的完整的目的非常单纯的站点。
这些控件是在
ASP.NET 2.0 中新增加的;在以前,开发人员必须手动添加文本框、按钮并编写 VB.NET 或者 C代码来处理这个过程、显示用户是否登录的消息、以及根据当前的用户改变页面。
到目前为止,您所需做的就是向页面中拖放一些控件,这就是搭建一个应用程序的架构必须完成的所有工作。
现在,让我们来看看添加到页面中的控件,从 Default.aspx 页面开始。
在 Source View 中查看 Default.aspx 页面将看到如下代码: ltasp:LoginView IDquotLoginView1quot Runatquotserverquotgt ltLoggedInTemplategt You are logged in lt/LoggedInTemplategt ltAnonymousTemplategt You are not logged in. lt/AnonymousTemplategt lt/asp:LoginViewgt ltasp:LoginStatus IDquotLoginStatus1quot Runatquotserverquot /gt 在代码中可以看到两个已定义的控件:用于显示登录信息的 LoginView 控件和用于控制登录与登出过程的 LoginStatus 控件。
注意如果按照本例进行配置,将无法看到匿名模板消息,因为匿名用户没有访问站点的权限而是被直接导航到登录页面。
在 Login.aspx 页面中,将看到如下已添加的代码: ltasp:Login IDquotLogin1quot Runatquotserverquotgt lt/asp:Logingt 几乎不用编写任何代码!所有的功能都已事先编写好,所以不会看到任何文本框,也不会看到任何身份验证代码—— 而只是看到一行代码。
ASP.NET 2.0 中提供工具让开发人员自己创建类似这种复杂的控件, 但这个内容超出了本章的讨论范围。
在前一个练习的第 7 步中单击管理链接之后,VWD 中将显示如图 4-6 所示的页面注意每回第一次启动这个站点的时候端口号都将不同。
图 4-6 1 单击 Security 链接显示 Security 设置管理选项卡,如图 4-7 所示。
图 4-7 2 该页面上有一个超链接,单击该链接可以启动 Security Setup Wizard。
单击该链接进入向导的第一步,如图 4-8 所示。
图 4-8 3 单击 Next 跳过这个页面,并进入如图 4-9 所示的界面。
选择 From theInternet 单选按钮允许匿名用户和已登录的用户访问这个站点。
图 4-9 单击 Next 进入下一步,如图 4-10 所示。
图 4-10 可以直接跳过该页面并单击 Next 继续—— 默认的提供商将提供所有的功能。
在下一个界面中,向导会询问是否希望为站点定义角色。
在这个示例中,可以跳过这一步—— 本章的后面将定义角色。
不要选中复选框并单击 Next。
4 在到达下一个界面之后,该向导将提示输入用户的一些详细信息,如图4-11 所示。
图 4-11 5 如图 4-12 所示,输入站点的某个用户的详细信息—— 这可能是您的姓名、我的姓名或者是其他任何人的姓名!只要别忘记所输入的口令就行—— 后面要用到这个口令。
单击 Create User 按钮将显示一个确认提示,此时可以单击Continue 创建另一个用户。
到现在为止,已创建了两个用户—— 一个标准用户和一个后面将用作站点管理员的用户。
图 4-12 在后面的练习中,将为这些用户指定恰当的站点访问权限。
注意现在还不能为用户指定任何角色—— 这将在后面的安装过程中完成。
单击 Next 继续。
6 下一步是为站点定义权限级别,定义谁能看到站点的内容,谁不能访问站点。
在这个步骤中,可以直接为用户添加权限。
在后面,将把这些用户添加到不同的群组并为整个群组的用户赋予权限。
如图 4-13 所示,需要为每个用户单独赋予 Allow 权限,并拒绝所有的匿名用户。
为了设置某个用户的权限,首先选中 User 单选按钮,在该按钮后面的文本框中输入用户名,选择 Allow,并单击Add This Rule。
要拒绝匿名用户访问,选中 Anonymous Users 单选按钮,在Permission 区单击 Deny,并单击 Add This Rule。
在单击 Next 之后,向导也将完成,这意味着现在有了一个拥有一些用户配置文件和访问权限级别的站点。
现在就只剩下运行页面了! 7 返回 VWD,按下 CtrlF5 运行 Default.aspx 页面—— 将看到如图 4-14所示的画面。
由于匿名用户无法访问站点,因此站点直接显示登录页面。
注意页面的地址,该地址表明要查看的是 Default.aspx 页面。
8 在登录之前,试着输入一些不合法的证书一个不存在的用户名和口令,但口令不能为空。
将看到如图 4-15 所示的画面。
图 4-13 图 4-14 图 4-15 9 现在以一个合法的用户账户登录;站点将自动把您带回 Default.aspx页面,如图 4-16 所示。
图 4-16 单击 Logout 链接将把您带回 Login.aspx 页面—— 这个站点不允许任何未登录的人查看网页。
操作回顾 用于
ASP.NET 页面的 Login 控件是 Microsoft
ASP.NET 小组为开发人员准备的礼物。
作者已经不记得参与过多少个带有定制登录功能的站点的开发, 每个站点都要编写代码实现这个功能,而现在作者所要做的只是向页面拖放几个控件。
除此之外,还可以使用向导配置账户和权限,进一步简化开发。
您可能希望使用自己的用户账户数据存储库,或者甚至链接到活动目录Active Directory用户账户,但这可以在后面的开发过程中修改。
这个练习逐步介绍了用户账户的配置。
但 虽然这是一个必要的过程, WebsiteAdministration 工具在幕后创建的内容更让人感兴趣。
首先,创建的用户账户配置文件必须保存在某个中心存储库,因此该工具为这个目的创建了一个新的配置文件数据库。
查看 C:BegASPNET2ChaptersBeginChapter04 目录会看到一个名为 App_Data 的文件夹。
单击右键并选择 Refresh刷新文件夹,应该看到一个名为 AspNetDB.mdf 的文件。
这是一个 Microsoft SQL 数据库文件,可以在VWD 的开发环境中查看这个数据库表格的结构和内容,如图 4-17 所示在学习数据库章节的时候将了解到这个过程的更多内容。
图 4-17 配置的另一个部分是为用户账户赋予一定的权限以便他们能够访问站点。
通过使用向导,这个过程可以变得很容易。
在向导完成之后,解决方案中就新增了一个名为 Web.config 的文件保存在服务器上以偏爱的方式运行站点的配置文件—— 详细内容请参阅第 2 章。
如果查看 Chapter04 文件夹中的 Web.config文件,将看到如图 4-18 所示的语句。
图 4-18 注意这个配置文件中的ltallow…/gt和ltdeny…/gt之间的内容反映了我们在示例中设置的权限。
可以手动直接添加和修改这些语句,或者使用 AdministrationTool 使这个过程流程化,两种方式都可以。
值得注意的是,LoginView 控件除了根据用户是否已经登录显示特定的文本以外还可以完成很多功能。
在第 11 章中,您将看到使用这个控件不仅基于用户的身份,而且基于用户的角色来改变整个页面的外观。
这个控件可以包含文本、HTML 甚至其他控件。
下一个“试一试”练习中将进行演示。
4.2.2 个性化 站点个性化以反映当前登录用户的偏好是实现社区化和归属感的一种好方法。
虽然本章不会进行很多个性化处理,但在下一章本书将讨论一些
ASP.NET 开发人员提供的功能,这些功能可以为用户提供更加个性化的用户界面和浏览体验。
对于任何个性化的站点,一个有用的附加功能是向已登录的用户通过某种类型的反馈信息,告诉用户站点已经正确地确认了他们的身份。
LoginName 控件是添加这种功能的简单方法。
在下面的“试一试”练习中,您将了解到如何使用这个控件。
在这个示例中,需要授权匿名用户访问站点。
1 可以选择任何一种喜欢的方式为匿名用户授权—— 要么编辑 Web.config 文件参考前面的“操作回顾”,要么启动 Web Site Administration Tool。
要再次启动这个工具,可以在系 统托 盘中 右击 管理 站点 图标 并选择 Open in Web Browser。
或者 ,如 果选 中修改Web.config 文件,只需在 VWD 中打开该文件并修改代码中的灰色部分: ltauthorizationgt ltallow usersquotquot /gt ltallow usersquotadministratorquot /gt ltallow usersquotchrishartquot /gt lt/authorizationgt 问号表示所有匿名用户,因此通过将 deny 改为 allow,启用匿名访问。
打开 Default.aspx 2 接下来需要对网页代码进行少量的修改以便添加 LoginName 控件。
页面并弹出 LoginView 控件的 Common Task 菜单单击该控件右上方的小箭头并选择LoggedInTemplate,如图 4-19 所示。
将文本修改为 You are logged in as,然后将一个LoginName 控件拖放到文本的结尾处。
图 4-19 3 在将 LoginName 控件添加到页面之后不需要对其进行任何修改,所以现在就可以保存修改并运行页面了。
首先看到的是一个匿名用户访问站点时的页面,如图 4-20 所示。
图 4-20 现在单击 Login 链接并登录站点。
登录成功之后,应该可以看到类似图 4-21 所示的页面,具体内容与登录所使用的用户账户有关。
图 4-21 操作回顾 使用 LoginName 控件在页面上显示当前登录用户的身份是一种快捷简单的方法。
如果切换到该页面的 Source View,就可以看到 LoginName 控件,如下代码灰色部分所示: ltLoggedInTemplategt You are logged in as ltasp:LoginName IDquotLoginName1quot runatquotserverquot /gt ltbr /gt lt/LoggedInTemplategt 在作者的代 码中增加 了一些 HTML 代码 ;因为我在 LoginName 控件之后 按下了Return以便 LoginStatus 控件能显示在下一行,在代码中出现了一个ltbr / gtHTML 标记。
这是一个简单的 HTML 换行代码。
在从 Design View 切换到 Source View 之后,开发人员经常可以看到类似的标记添加到代码中。
最常见的两个符号是ampnbsp和ltbr / gt;ampnbsp是一个不可中断的空格这个空格将和紧靠在它前面和后面的内容显示在同一行上,而ltbr / gt是一个简单的换行符。
这个示例的重点不是 HTML 代码,而是 LoginName 控件的源代码。
同样,在产生的代码中也没有任何让人兴奋的内容,因为
ASP.NET 在幕后完成了寻找当前登录用户名称的重任,并在服务器呈现页面的时候将其插入到页面中。
注意并没有将 LoginName 控件添加到 Anonymous 模板中,其实也没有理由要这样做—— 如果作为匿名用户访问站点,该控件不会显示任何信息。
到现在为止您已经花了一定的时间试验用户账户和站点登录。
在本章的前面,我们已经讨论过角色的概念。
下一小节将介绍角色是什么以及怎样使用角色细化站点成员的特征。
4.2.3 成员关系 定义哪些用户可以访问站点对于一个小型的站点来说是完全可行的,但站点必须非常小而且规模必须保持在一个可管理的范围内。
一种更好的解决方案是定义一组用户角色,然后将用户账户添加到恰当的角色中。
一旦用户成为某个角色的成员之后,就可以基于角色为用户授权。
例如,考虑一个典型的站点配置情景:Administrators 角色的所有成员可以访问站点,而且可以访问站点的所有部分。
Users 角色的所有成员可以访问该站点,但不能访问某些受限的部分。
所有匿名用户都将看到裁减过的页面,但没有任何个性化信息,而且理所当然不能访问受限的部分。
第 11 章将更详细地讨论角色,包括充分利用角色细化 Wrox United 站点。
同时,在下面的“试一试”练习中可以体验到角色的作用,因为其中将扩展 Chapter04 示例包含角色。
在这个示例中将定义两种角色:Users 和 Administrators。
在向角色添加用户之前必须先创建这些角色。
1 先再次启动 Web Site Administration Tool。
如果最近曾经使用过这个工具,那么可以 或 可右击系统托盘中该工具的图标并选择 Open in Web Browser。
者 , 以 在 VWD 的主菜单条中选择.