《第6 章 构建 Web 应用程序.pdf》由会员分享,可在线阅读,更多相关《第6 章 构建 Web 应用程序.pdf(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 6 章 构建 Web 应用程序 大多数 Visual Basic 程序员都至少会进行一些 Web 开发。开发 Web 应用程序解决方案有两个常见的原因,一是为了使用一个简单的部署模型,二是为了拥有最广泛的潜在用户群(即任何使用浏览器的人)。虽然 Microsoft.NET Framework 的每个后续版本都使部署 Microsoft Windows 应用程序更为简单,但是 Web 应用程序在许多情况下仍然具有部署和访问优势。Visual Studio 2005 中熟悉的事件驱动、拖拉开发范型允许根据目标用户和期望部署模型(而不是开发团队的 Web 编程经验)来构建 Web 应用程序。在
2、Web 编程的早期,程序员构建的应用程序解析传入的 HTTP 请求,并利用字符串操作生成 HTML 输出。使用库(如用于 Perl 的 CGI 库)来处理常见任务,但是,正确地解析和处理请求的责任最终却落到了程序员身上。随着时间的推移,这种开发范型不断发展,并出现了新的 Web 开发技术,例如用于生成 HTML 输出的 Java servlets 或 ASP 与 COM 组件的组合。这些更新的技术通常要求程序员在多个开发环境中工作,它们仍然需要许多代码来生成基本的 HTML 输出,而得到的应用程序很难调试、维护和部署。然后,.NET Framework(包括 ASP.NET 1.0)和 Mic
3、rosoft Visual Studio.NET 的发布为开发人员引入了更好的方法,以使用服务器控件、事件处理程序、用任何.NET 语言编写的代码隐藏类以及高效的单向数据绑定来构建 Web 应用程序。Visual Studio 2005 构建于 Visual Studio.NET 引入的创新基础之上,使得无论是经验丰富的开发人员还是 Web 开发新手,进行 Web 开发都变得比以前更容易。对于 Web 开发人员而言,ASP.NET 是一个巨大的飞跃。ASP.NET 2.0 则是另一个巨大的飞跃。改进的一个主要方面是显著减少了常见任务(如数据访问)所需的代码行数。应用程序:零代码应用程序:零代码
4、 Web 站点站点 此应用程序演示 ASP.NET 2.0 中的改进,使您能够创建一个强大的交互 Web 应用程序,而无需编写任何 Microsoft Visual Basic 代码。新概念新概念 大多数重要的 Web 应用程序都需要某种数据存储,不管它是 Microsoft SQL Server 数据库、Microsoft Access 数据文件、XML 文件还是某些其他类型的数据源。根据应用程序的复杂程度,UI 显示直接从数据存储检索的数据,或者从一组业务对象获得的数据。在 ASP.NET 1.1 中,即使一个简单的 Web 页(用于显示直接来自数据库的产品列表)也需要大量代码来连接数据库
5、,并将数据绑定到服务器控件。在 ASP.NET 2.0 中,许多常见的数据访问情况可以只通过声明 ASPX 标记来实现 不要求编程。ASP.NET 2.0 中新的“零代码”功能涵盖最常见的数据访问情况。最简单的情况是使用一个服务器控件显示数据源数据的单向数据绑定。这种情况的常见例子是在下拉列表中显示州/省/市/自治区列表。一种更复杂的情况是使用多个控件的单向数据绑定,其中在一个控件中选择的值会影响在另一个依赖控件中显示的值 例如,在下拉列表中显示国家/地区列表,然后当选中某个国家/地区时,在另一个下拉列表中显示该国家特有的州/省/市/自治区列表。对于某些服务器控件,ASP.NET 2.0 甚至
6、包括内置的排序和分页功能。ASP.NET 2.0 中令人印象最深刻的“零代码”功能指:能够轻松地提供添加、更新和删除数据的用户界面和数据访问逻辑,而无需像在 ASP.NET 1.1 中一样编写这些基本操作所需的基础结构代码。声明性语言声明性语言 零代码 Web 站点这个短语可能有点用词不当,因为 ASP.NET 标记语言(即 ASPX 语言)正逐渐被认为是一种声明性编程语言。如果您具有严格的命令式编程背景,即使用过诸如 C、S、Java 和 Visual Basic 等编程语言,那么将 ASPX 视为一种编程语言也许听起来有点令人困惑,因为声明性编程是一种很不一样的编程模型。对于许多程序员而言
7、,基于 XML 的语言“感觉”根本不像一种编程语言。命令性编程往往相当直接地意味着非常低级的计算机操作方式。在任何特定的时刻,程序都处于通过执行所提供的指令而达到的特定状态。通过执行其他指令,程序会以一个新状态结束。当用命令性语言编程时,您通过提供实现目标所需的特定操作(即,告诉计算机如何实现目标)来实现期望的目标。当用声明性语言编程时,您指定目标,而编译器或解释器使用它预定义的算法来确定实现该目标的适当操作。如果不习惯考虑声明性编程,这些概念可能听起来有点陌生,但您可能已经不知不觉地成为了一名更有经验的以声明性方式编程的程序员。考虑以下声明性代码:SELECT*FROM Products W
8、HERE ProductID=55 您可能会认为这是 SQL 代码。SQL 是一个非常流行的声明性语言实例。SELECT 查询表示一个最终结果:选择 Products 表中 ProductID列值为 55 的各行的所有列。将这种查询表示为一组可执行的操作,该任务由该查询所发送到的任何数据库的查询处理引擎来完成。现在考虑一个 ASP.NET 标记块:该“代码”没有包含一组指令,而是定义一个最终结果:一个窗体包含一个用“Canada”预填充的文本框和一个标记为“Save”的按钮。ASP.NET 有一个预定算法,可以将这些声明转换成适合不同类型浏览器的输出(例如,适合 Internet Explor
9、er 的 HTML)。不必提供获取正确输出所需的任何特定操作,因为 ASP.NET 替您负责这些工作。正如本节中的应用程序所演示的,ASP.NET 标记只需很少的编程工作就可以提供很多功能。使用 ASPX 语言不只可以控制布局或到 HTML 的简单映射,ASPX 还允许定义行为,包括丰富的用户界面和数据库通信。当使用 ASPX 时,您使用的远不只是用于编码用户界面的数据格式 您正在使用一种最新和最流行的声明性语言进行编程。数据绑定数据绑定 在发布.NET Framework 之前,数据绑定的名声不佳,因为对于需要复杂行为的应用程序而言,使用 Visual Basic 6 非常麻烦。.NET F
10、ramework 1.0 版引入新的数据绑定功能,该功能模仿大多数开发人员自己编码以获取数据绑定行为的做法。.NET Framework 的一个最了不起的功能是:可以使 Web 开发人员在 Web 窗体上使用高效而简单的单向数据绑定。只要提供一个可绑定的服务器控件(例如具有数据源的 DropDownList),该服务器控件就可以负责循环数据,并为每个数据项生成适当的 HTML。虽然这样做非常简单,但 ASP.NET 1.1 中的数据绑定仍需要代码来创建数据源,将数据源分配给适当的数据控件,然后调用数据控件的 DataBind 方法来实际使控件循环访问数据源。在 ASP.NET 2.0 中,只需
11、封装数据源设置和 ASPX 中的绑定,而让服务器控件负责其余的工作。演练演练 ASP.NET 2.0 中最简单的数据绑定是数据源数据的只读表格显示。使用 Visual Studio 2005 IDE,首先创建一个新的 Web 窗体,并将数据源控件拖到该窗体上。此应用程序使用 SqlDataSource 控件,不过还可以使用其他数据源控件,例如 Microsoft Access 数据文件或 XML 文档。SqlDataSource 控件负责连接到 Microsoft SQL Server 数据库并检索所请求的数据。当将新的 SqlDataSource 控件添加到窗体时,Data Source C
12、onfiguration Wizard 可以指导您设置该控件。第一步是建立该控件与数据库通信的连接设置。图 6-1 显示已经配置第一步中到 Northwind 数据库的连接。图图 6-1 Data Source Configuration Wizard。接着,指定希望数据源控件从数据源选择的数据。此应用程序使用一个简单的查询来选择 Northwind 数据库中 Products 表的所有行:SELECT*FROM Products 有了连接和 SELECT 查询,SqlDataSource 控件就具备从数据库检索数据所需的全部信息。向导所生成的 ASPX 标记的结果为:asp:SqlDataS
13、ource ID=ProductsDS”Runat=server”SelectCommand=SELECT*FROM Products ConnectionString=您将注意到,以声明方式从 web.config 配置文件读取连接字符串使用了新语法。web.config 中对应的项如下所示(为提高可读性,添加了换行符):既然 Web 窗体有了数据源控件,您就可以添加支持数据绑定的其他控件,并将它们绑定到数据源控件。对于简单的表格显示,新的 GridView控件不需要特殊的配置 只要为其提供数据源控件的 ID,它就可以生成完整的数据表。可以使用 GridView 的 Common Tasks
14、 智能标记来分配数据源,或者只使用下面的 ASPX 标记来设置 GridView 的 DataSourceID 属性:可视化 Web 设计器中的最终结果如图 6-2 所示。SqlDataSource 控件在设计视图中是可见的,但当在 Internet Explorer 中查看时,只有由 GridView 生成的数据表是可见的,如图 6-3 所示。图图 6-2 使用零代码绑定到 SqlDataSource 的 GridView。图图 6-3 在 Internet Explorer 中查看的最终输出。双向数据绑定双向数据绑定 虽然使用零代码进行单向数据绑定非常方便,但创建快速只读显示的总工作效率优
15、势不是那么显著。在 ASP.NET 1.1 中,更可怕的工作是为 CRUD(创建、读取、更新和删除)操作进行双向数据绑定,并提供一个可用的界面,包含诸如排序和分页这样的功能(例如,每页显示 10 条记录,并有 Next 和 Previous 按钮)。ASP.NET 2.0 简化了双向数据绑定工作,并同样需要零代码。奥秘在于数据源和 GridView 控件的功能。在此应用程序的第一页,可以看到如何创建配置为只选择数据的 SqlDataSource 控件。但 SqlDataSource 控件还可以用于更新、插入和删除数据。对于不同类型的查询,SqlDataSource 控件只需适当的 SQL 命令
16、和参数。可以自己输入多行 ASPX 标记,也可以使用 Data Source Configuration Wizard 的高级功能来创建标记。在为 Data Source Configuration Wizard 设置数据选择后,“Advanced Options”按钮就可以使用了,它打开图 6-4 所示的对话框窗口。选中第一个复选框将提示向导利用您提供的选择信息来探测数据库的数据结构。查询完数据库的结构后,向导将自动创建 SqlDataSource 控件对数据库执行 CRUD 操作所需的全部 ASPX 标记。图图 6-4 Data Source Configuration Wizard 的高
17、级 SQL 生成选项。在 Visual Studio.NET 2003 中,向导(例如 Data Adapter Wizard)可以帮助您创建进行 CRUD 操作的代码,但结果是 Visual Basic(或者 C#)代码,然后必须将其以编程方式绑定到数据控件。另外,将生成的代码放置在代码文件的“设计器生成的”区域,在这里进行更改会有极大的危险,因为如果再次调用向导这些更改将丢失。将生成的代码移出“设计器生成的”区域意味着不能使用向导来更改适配器设置。相比之下,Visual Studio 2005 中的 Data Source Configuration Wizard 生成的 ASPX 标记用
18、相应的参数声明性地表示更新、插入和删除命令。下面的 ASPX 清单显示向导为 Northwind Products 表生成的标记。asp:SqlDataSource ID=SqlDataSource1”Runat=server”SelectCommand=SELECT Products.*FROM Products ConnectionString=“DeleteCommand=DELETE FROM Products WHERE Products.ProductID=ProductID InsertCommand=INSERT INTO Products(Products.ProductNa
19、me,Products.SupplierID,Products.CategoryID,Products.QuantityPerUnit,Products.UnitPrice,Products.UnitsInStock,Products.UnitsOnOrder,Products.ReorderLevel,Products.Discontinued)VALUES(ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued)Update
20、Command=UPDATE Products SET Products.ProductName=ProductName,Products.SupplierID=SupplierID,Products.CategoryID=CategoryID,Products.QuantityPerUnit=QuantityPerUnit,Products.UnitPrice=UnitPrice,Products.UnitsInStock=UnitsInStock,Products.UnitsOnOrder=UnitsOnOrder,Products.ReorderLevel=ReorderLevel,Pr
21、oducts.Discontinued=Discontinued WHERE Products.ProductID=ProductID 现在,其他数据控件(如 GridView)可用于更改数据库中的数据(通过 SqlDataSource 控件)。为了使 GridView 控件能够更改数据,在“Properties”窗口中将 AutoGenerateDeleteButton 和 AutoGenerateEditButton 属性设置为 True,如图 6-5 所示。图图 6-5 启用数据更改的 GridView 属性。所得到的标记与单向数据绑定示例没有太大的不同。添加的只是具有两个属性的 Com
22、mandField 元素,它告诉 ASP.NET 生成编辑和删除链接按钮:当在浏览器中查看该 GridView 时,可以看到每行数据的 Edit 与 Delete 链接。如果单击 Edit 链接,该行就变成一组可编辑的控件(一般是文本框),如图 6-6 所示。单击“Update”将更改保存到基础数据源(本例为 Microsoft SQL Server)。这就是不用编写一行代码的双向数据绑定!图图 6-6 在 Internet Explorer 中使用零代码编辑产品。修饰零代码站点修饰零代码站点 这些零代码功能的确令人注目,但目前在视觉上不是太有感染力或者不是太用户友好。随着家庭和商务用户越来越
23、习惯于利用 Web 来工作和娱乐,他们要求 Web 页更具有视觉感染力 即使是编辑库存数据。幸运的是,ASP.NET 2.0 对格式设置有大量的支持,换句话说,它可以改善零代码 Web 站点的外观。例如,GridView 控件允许您控制颜色、字体和布局信息来创建具有吸引力并且实用的数据表。为数据控件选择一个专业的预打包外观的最快方法是使用 Auto Format 功能,通过“Common Tasks”智能标记窗口可以访问该功能,如图 6-7 所示。还可以利用“Common Tasks”窗口来启用 GridView 控件的排序和分页功能。如果您曾经尝试使用 ASP.NET 1.1 中的分页(例如
24、 DataGrid),您就会意识到使用 GridView 控件是多么简单 只需选中一个复选框即可。GridView 和 SqlDataSource 负责控制分页的其余细节。图图 6-7 GridView Common Tasks 智能标记对话框窗口。“Auto Format”对话框允许从许多预构建的格式中进行选择,这些格式包括颜色、字体、行的样式、可选行样式、选定的行样式、标题行样式,等等。图 6-8 所示的“Auto Format”对话框用于为支持分页(每页最多 10 条记录)但不支持排序的 GridView 选择一种格式。图图 6-8“Auto Format”对话框窗口。Visual St
25、udio 2005 中的 Auto Format 功能为选定的控件生成许多元素和属性。利用 Sand&Sky 格式生成下面的标记:.为每个网格复制所有这些格式设置,从而使 Web 站点中数据网格的格式保持相同,这是一项非常费力的任务。幸运的是,通过创建一个新的主题(将在下一个应用程序中说明)可以将这种格式统一应用于 Web 站点。注注当启用分页时,可以利用 GridView 控件的 PageSize 属性来更改每页显示的数据行数。小结小结 每一个 Web 应用程序都是独特的,但总会有一些相似之处。一个相似之处是用于只读显示的基本数据访问,或用于查看和修改数据的界面。ASP.NET 2.0 中新
26、的零代码功能使得编写有用的 Web 应用程序构造块而无需编写任何代码成为可能!利用向导和其他设计时功能,Visual Studio 2005 可以生成定义重要 Web 应用程序的所有 ASPX 标记。数据访问只是使用零代码功能可以实现的常见任务之一。在下面的两个应用程序中您将看到,无需编写任何代码还可以创建一个具有身份验证功能的 Web 站点,包含新用户注册和用户登录。应用程序:成员身份、配置文件和角色应用程序:成员身份、配置文件和角色 此应用程序重点介绍 ASP.NET 2.0 中新的成员身份、配置文件和基于角色的安全功能,这使得确保 Web 应用程序的安全性更简单。新概念新概念 大多数实际
27、的 Web 应用程序都有一些受限区域,这些区域要求对用户进行身份验证,这样才能根据是否授权用户使用受保护的资源来授予或拒绝授予访问权限。常见的例子是更新内容或查看站点统计信息的管理区域。ASP.NET 支持几种身份验证方案,包括集成的 Windows 身份验证和 Passport 身份验证。Windows 和 Passport 身份验证仅对某些类型的应用程序是适合的,而对许多应用程序都不适用。Windows 身份验证要求每个用户都有一个用户帐户。Passport 身份验证对于小型和中型站点而言成本过高。因此,许多站点选择自定义身份验证逻辑和自定义数据存储来存储证书和其他与用户相关的数据,例如姓
28、名、地址等。ASP.NET 1.1 站点可以利用 Forms 身份验证完成诸如设置身份验证 cookie 这样的工作,它们可以使用一个通用的 API 来决定某个用户是否登录,以及该用户属于什么授权角色。而创建管理用户帐户的基础结构是 Web 开发人员的责任。结果是将无数的 ASP.NET Web 应用程序投入生产,每个应用程序中实现的身份验证模型几乎完全相同。这种常用的身份验证模型非常普遍,因此应当直接将它嵌入到 Web 应用程序平台中。而这正是 ASP.NET 2.0 提供的新的成员身份和用户配置文件功能。成员身份成员身份 ASP.NET 2.0 中新的成员身份功能主要以三种方式简化用户管理
29、:1.自动创建数据存储。(ASP.NET 2.0 为 Access 和 Microsoft SQL Server 配备有内置的提供程序。)当尝试使用成员身份功能时,ASP.NET 2.0 检查是否配置了指定的数据存储。如果没有配置,ASP.NET 就创建。ASP.NET 2.0 中包含一个 Access 成员身份数据文件的模板和用于创建 Microsoft SQL Server 成员身份数据库的脚本。2.它们包含创建和验证用户以及显示用户特定信息和登录状态的服务器控件。新控件(如 Login、LoginStatus、CreateUserWizard 和 ChangePassword 控件)提供
30、预构建的用户界面构造块,包括用于最常见的与成员身份相关的任务的功能。在新 Web 控件应用程序中重点介绍这些控件。3.它们提供一种以编程方式管理用户的应用程序编程接口(API)。Membership API 是通过 Membership 类访问的,包含非常有用的方法,例如 CreateUser、DeleteUser 和 ValidateUser。利用 ASP.NET 2.0 成员身份,不用编写任何代码就可以实际创建一个具有受保护页、自动重定向到登录页、用户创建(注册)和用户登录的 Web 站点!在此应用程序的“演练”一节中您将看到,web.config 中的一些 XML 元素和一些服务器控件都
31、是使用 ASP.NET 2.0 创建一个支持身份验证的 Web 应用程序所需要的。用户配置文件用户配置文件 ASP.NET 2.0 中的成员身份功能允许您收集对于身份验证非常重要的基本用户信息,例如用户名、密码、电子邮件地址以及取回密码所需的问题/回答机密对。但经常需要收集和存储其他信息,例如姓名、Web 站点或 Weblog URL、职称,还可能更多。ASP.NET 2.0 中新的用户配置文件功能使您能够定义应用程序必须存储的有关用户的其他信息。只需在 web.config 中指定需要的信息,然后在运行时填充特殊 Profile 对象中的相应字段。ASP.NET 2.0 生成的 Profil
32、e 对象是特定于应用程序的,并且包含的强类型属性映射到应用程序 web.config 文件中的项。在设计时,Visual Studio IDE 读取这些项,并自动构建一个专有类(从 HttpProfileBase 继承),这样就可以在“Intellisense”菜单中使用特定于应用程序的属性,并且可以通过编译器进行验证。此应用程序的“演练”一节说明如何在 web.config 中设置用户配置文件,然后说明如何在运行时访问特定于用户的配置文件数据。基于角色的安全性基于角色的安全性 可以通过在 Web 站点上对用户进行身份验证来识别用户,但如果没有其他的基于角色的授权,就不能根据用户的身份限制其对
33、 Web 资源的访问。ASP.NET 始终内置支持通过用户的安全用户对象来确定用户是否具有某种角色。使用 Windows 身份验证时,角色来自于 Windows 安全组。但是使用 ASP.NET 1.1 中的 Forms 身份验证时,必须构建自己的安全用户对象,并在对每个 Web 请求进行身份验证时填充它的角色集合。作为开发人员,您还要负责编写代码来维护用户角色的数据存储,以及在运行时加载这些数据。通过引入 ASP.NET 角色管理,ASP.NET 2.0 扩展基于角色的安全功能,包括新的 Roles 类和 web.config 的 配置节。ASP.NET 角色管理提供最常用的基于角色的安全功
34、能,这些功能在以前必须自己构建。Roles 类提供的 API 可以用于创建和删除角色,从角色中添加和删除用户,枚举角色,枚举具有某种角色的用户,枚举某个用户所具有的角色等。ASP.NET 角色管理负责持久化角色成员身份数据,在运行时加载角色成员身份数据,以及为用户的安全用户添加适当的角色。演练演练 此应用程序演示如何使用 ASP.NET 2.0 中新的成员身份、配置文件和基于角色的安全功能。本演练包括有关配置这些新功能和以编程方式使用它们的详细信息。成员身份成员身份 在 Visual Studio 2005 中配置 ASP.NET 成员身份非常容易。当在 Visual Studio 2005
35、中创建新 Web 站点时,解决方案资源管理器的外观如图 6-9 所示。图图 6-9 访问 Membership API 之前的解决方案资源管理器。当在运行时访问 Membership API 时,系统会自动创建在 ASP.NET 配置中指定的成员身份数据库(如果它不存在)。ASP.NET 2.0 附带成员身份的 Microsoft Access 数据文件模板,以及一组用于创建 Microsoft SQL Server 成员身份数据库的 SQL 脚本。用于持久化成员身份数据的数据存储类型用 ASP.NET 配置来控制。如果没有在 web.config 中显式声明数据提供程序,则使用 machin
36、e.config 文件中的默认值。在此应用程序中,machine.config 中的默认值是 Microsoft Access 的提供程序,因此当访问 Membership API 时,系统会在 Web 站点的 Data 子文件夹中自动创建一个 Access 数据文件。图图 6-10 显示自动生成成员身份数据文件的解决方案资源管理器。此应用程序中的第一个 Web 窗体访问 Membership API 中三个最有用的方法:CreateUser、ValidateUser 和 GetAllUsers。该 Membership API 还包括进行身份验证管理所需的其他类型的维护功能,例如通过电子邮件
37、地址查找用户、修改用户、删除用户以及设置密码。该 API 中的方法易于使用并且清楚易懂。例如,CreateUser 方法的最简单版本采用两个易于理解的参数:用户名和密码。CreateUser 的重载版本还采用电子邮件地址作为参数。您只需编写如下一行代码即可创建成员身份数据库中的新用户:Membership.CreateUser(txtUserName.Text,txtPassword.Text)CreateUser 方法调用可以创建数据库中的用户,但有时需要检索数据库中的数据,以便可以验证用户的凭据。只需调用 ValidateUser 方法即可自动完成所有这些工作:If Membership.
38、ValidateUser(txtUserName.Text,txtPassword.Text)Then FormsAuthentication.SetAuthCookie(txtUserName.Text,False)Response.Redirect(Request.Path)End If Membership API 使得可以轻而易举地完成常见类型的用户管理任务,否则您必须编写这些任务的所有数据访问和业务逻辑。例如,要检索成员身份数据库中的所有用户列表,只需枚举 GetAllUsers 方法返回的用户集合:Dim users As MembershipUserCollection=Memb
39、ership.GetAllUsers()此应用程序中 Default.aspx 的全部源包括用于用户名和密码的 TextBox 控件,以及用于创建用户或以用户身份登录的 Button 控件。该 Web 窗体还包含存放成员身份数据库中所有用户列表的 ListBox。用 Label 来显示登录状态。下面的 ASPX 标记和 Visual Basic 代码是处理成员身份的 Default.aspx 的子集(即,这些代码没有添加用户配置文件和基于角色的安全功能):Sub Page_Load(ByVal sender As Object,ByVal e As System.EventArgs)Dim u
40、sers As MembershipUserCollection=Membership.GetAllUsers()Dim userArray As New ArrayList(users.Count)For Each mu As MembershipUser In users userArray.Add(mu.Username)Next UserList.DataSource=userArray UserList.DataBind()If User.Identity.IsAuthenticated Then lblLoginStatus.Text=“You are currently auth
41、enticated as“+_ User.Identity.Name End If End Sub Sub btnCreate_Click(ByVal sender As Object,_ ByVal e As System.EventArgs)Membership.CreateUser(txtUserName.Text,txtPassword.Text)End Sub Sub btnLogin_Click(ByVal sender As Object,ByVal e As System.EventArgs)If Membership.ValidateUser(txtUserName.Text
42、,txtPassword.Text)Then FormsAuthentication.SetAuthCookie(txtUserName.Text,False)Response.Redirect(Request.Path)End If End Sub Untitled Page Username:Password:Users in Membership database:图 6-11 显示在运行时只添加成员身份功能的 Default.aspx。在新的 Web 控件应用程序中您将看到,ASP.NET 2.0 通过提供新的安全控件(如 Login 和 LoginStatus 控件)使身份验证的用户
43、界面更简单。图图 6-11 Internet Explorer 中显示成员身份数据库内所有用户的 Web 窗体。注注 ASP.NET 中默认的身份验证模式是 Windows。为了使用 Forms 身份验证(此应用程序使用这种方式),必须将 web.config 中 元素的 Mode 属性设置为“Forms”。用户配置文件用户配置文件 ASP.NET 2.0 中的用户配置文件有时称为用户个性化或配置文件个性化,在 Web 站点的 web.config 文件中进行配置。可以在该配置文件中以声明性方式声明希望为每个用户存储的数据,然后在某个特殊的 Profile 对象中填充对应的属性。下面的 web
44、.config 文件子集配置 Web 站点来存储每个用户的 FirstName 和 LastName 字符串值:Visual Studio 2005 从 web.config 文件读取这些配置信息,并动态地创建从 HttpProfileBase 继承的专用类。该专用类包含 web.config 文件中定义的具有正确数据类型的所有属性。图 6-12 例举一个在 Intellisense 中可用的自定义配置文件属性。图图 6-12 在 Intellisense 中可用的强类型配置文件属性。在运行时,ASP.NET 2.0 负责管理配置文件数据的持久性。作为程序员,您唯一的任务是读写这些数据。下面的
45、代码说明如何设置 FirstName和 LastName 属性,并将它们保存在配置文件数据存储中:Profile.FirstName=txtFirstName.Text Profile.LastName=txtLastName.Text Profile.Save()要从 Profile 对象读回数据,只需颠倒赋值语句即可:txtFirstName.Text=Profile.FirstName txtLastName.Text=Profile.LastName 默认情况下,这些配置文件属性只能为经过身份验证的用户设置(因此也只为他们存储)。但在有些情况下,当用户匿名浏览站点时,您需要捕获信息;而
46、当该用户登录站点时,您需要维护数据。ASP.NET 用户配置文件本身支持这种情况。必须使用 web.config 中的 元素显式启用匿名配置处理。然后,希望支持匿名用户的任何属性都必须将 allowAnonymous 属性设置为 true。下面来自 web.config 的 XML 显示此应用程序的这些设置:基于角色的安全性基于角色的安全性 ASP.NET 2.0 角色管理提供许多与创建和维护角色与角色成员身份有关的功能。要启用 Web 站点的角色管理,可以将 元素添加到 web.config 文件。在配置角色管理时,可以选择将用户的角色加密并缓存在 cookie 中。虽然缓存有助于减少往返数
47、据存储以获得用户角色信息的次数,但它也带来一个问题:cookie 中的角色与在服务器端数据存储中最近更新的角色集不匹配。当大量更改角色成员身份时,这种差异可能特别容易产生问题。对于此应用程序,通过将 元素的 cacheRolesInCookie 属性设置为 false 来禁用 cookie 缓存:现在每次处理经过身份验证的请求时,都将重新从数据存储中读取角色,并将其加载到用户的安全用户对象中。在为用户分配角色之前,您必须创建角色。使用 Roles 类的 Create-Role 方法可以做到这一点。逐个应用程序存储角色,因此为该应用程序创建的角色与其他应用程序的角色完全无关。Roles.Crea
48、teRole(“Admin”)Roles.CreateRole(“Editor”)Roles.CreateRole(“Reviewer”)一旦创建了角色,就可以进行所需的维护任务,例如获得应用程序中所有角色的列表。GetAllRoles 方法返回一个 String 对象数组,包含以前所创建角色的名称:Dim allRoles()As String=Roles.GetAllRoles 既然角色已实际存在,就可以将用户分配给角色。为了一次将一个用户分配给一个角色,请使用 AddUserToRole 方法:Roles.AddUserToRole(UserList.SelectedValue,Role
49、sList.SelectedValue)如果想将多个用户同时添加给某个角色,可以使用 AddUsersToRole 方法。如果想将一个用户添加给多个角色,可以使用 AddUserToRoles 方法。将多个用户同时添加给多个角色,可以使用 AddUsersToRole 方法。ASP.NET 2.0 角色管理还添加了一种新功能,该功能解决 ASP.NET 1.1 中微不足道但却让人感到不便的限制 不用编写读取基础数据源的数据访问代码就能够获得某个用户所有角色的列表。Roles.GetRolesForUser(User.Identity.Name)图 6-13 显示如何将这些功能集中在一个简单的用
50、户界面中,可以使用该界面创建用户,创建角色,将用户分配给角色,然后以用户的身份登录,并查看应用程序中所有的角色,以及单个用户所属的全部角色。图图 6-13 正在使用的成员身份、配置文件和角色。小结小结 用户管理是一项几乎普遍存在的 Web 开发任务,它有许多已经确立的构建模式,包括使用用户名和密码的身份验证;存储用户配置文件信息(如姓名和地址);以及基于角色的授权。ASP.NET 1.1 提供一些对用户管理的支持 例如通用身份验证模型和内置区分经过身份验证的用户和匿名用户的功能 并提供一些对基于角色的授权的支持。但是在 ASP.NET 1.1 中,为常见用户管理任务创建与维护逻辑和数据存储的重