借助 ASP.NET 2.0,您无需编写代码即可向自己的网站添加身份验证、授权和各种配置文件。与以往相比,这显然是一个巨大的进步。与 ASP.NET 2.0 中的多数新功能一样,身份验证、授权和配置文件都有自己的内置提供程序。您可以将提供程序看作是包含有完成某项特殊任务所用方
借助 ASP.NET 2.0,您无需编写代码即可向自己的网站添加身份验证、授权和各种配置文件。与以往相比,这显然是一个巨大的进步。与 ASP.NET 2.0 中的多数新功能一样,身份验证、授权和配置文件都有自己的内置提供程序。您可以将提供程序看作是包含有完成某项特殊任务所用方法的模块。这些提供程序非常灵活,您可以通过指定属性对其进行自定义。这些指定的属性将信息传入提供程序,以使其执行不同的操作行为。但如果自定义的程度很高,则可能需要使用自定义的或第三方的提供程序来替换内置版本。ASP.NET 的配置文件功能允许开发人员针对每个用户指定设置或数据。所有这些数据都可以存储在一个匿名配置文件中,从而无需用户登录网站即可对这些设置进行检索。但是,如果用户创建一个帐户,这些设置也可以迁移到已登录的配置文件中。您也可以选择关闭匿名配置文件功能。
要存储一个用户的配置文件属性并对其进行检索,只需将每个配置文件属性命名并添加到 web.config 文件内的配置文件元素即可,如图 1 所示。这样便将配置文件属性放入配置文件的 SettingsPropertyValueCollection 中。您也可以为每个属性指定数据类型和一个默认值。
ASP.NET 会读取 web.config 文件以查找配置文件分区组。如果能找到分区组,ASP.NET 会接着查找一个类型字符串/连接字符串属性(未在图 1 中示出)。如果未发现分区组,则会检查 machine.config 文件。多数情况下,由于安装了 ASP.NET,machine.config 文件通常不会被修改。默认情况下的 machine.config 文件含有 System.Web.Profile.SqlProfileProvider,它在系统中注册为配置文件功能的默认提供程序。SqlProfileProvider 按规定要使用 LocalSqlServer 连接字符串名称来连接目标数据库,以获得配置文件信息(所有的连接字符串名称和属性均存储在名为 connectionStrings 的组中,您可以在 web.config 文件中找到它)。默认情况下,LocalSqlServer 连接字符串被定义为一个 SQL Server™ 2005 Express 数据库,您可以在 |DataDirectory|aspnetdb.mdf(在 ASP.NET 中转换为 \App_Data\aspnetdb.mdb)中找到该数据库。
SqlProfileProvider 存储配置文件信息所用的数据库必须使用一种已知架构进行配置。如果一个 SQL Server 2005 Express 数据库正在使用中,ASP.NET 可以根据需要动态地创建数据库文件和必需的表格、视图和存储过程等等。否则,可使用 Microsoft® .NET Framework SDK 中提供的 aspnet_regsql 工具。aspnet_Profile 表格是上述表格中的一种,它可以用于存储每位用户的配置文件信息。用户在向其配置文件分配一个配置文件属性时,会在表格中新添加一行,其中含有用户的唯一 UserID,每个配置文件属性名包含在单独的一列中,与每个配置文件名相关的数据则包含在另一列中。在图 2 中,您会发现数据将以 BLOB 类型存储。属性名和属性值可以以各种数据格式存在,其中包括连续字符串、XML 数据集或二进制序列化数据。因此,使用内置的配置文件提供程序存储配置文件数据使开发人员或数据库管理员难以使用 SQL 来查询或修改数据。如果默认的提供程序的功能无法完全满足您的需要,您可以使用自定义的提供程序。
使用一个自定义配置文件提供程序
ASP.NET 团队在开发新版本的 ASP.NET 的同时,也在全力以赴增强现有版本的功能。他们开发了名为 Sandbox 项目的众多实用资源,您可以从 ASP.NET 的官方网站 sandbox.asp.net 下载这些资源。其中很多项目都有一个非常酷的特点,即它们可以应用于生产环境。您可以在这里找到一些最酷的 ASP.NET 加载项,其中包括 Web Deployment Project(Web 部署项目)和 Table Profile Provider Samples(表格配置文件提供程序示例)。在本项目中,我将使用 Table Profile Provider Samples,您可以从 asp.net/sandbox/samp_profiles.aspx?tabid=62 获得。
与内置的 ASP.NET 配置文件提供程序不同,Table Profile Provider Samples 允许配置文件数据以一种易于读取的格式进行存储。下载包中包含两个示例提供程序及其使用说明。SqlTableProfileProvider 允许数据以单列的形式存储在一个配置文件表格中。该表格中必须包含 UserID 唯一标识符(作为主关键字)和 LastUpdatedDate 日期时间字段。UserID 字段可允许每条配置文件记录与 aspnet_Membership 和 aspnet_Users 表格中包含的用户帐户建立关联。您会发现上述任何字段均无需在 web.config 文件中进行指定。另外一个配置文件示例,即 SqlStoredProcedureProfileProvider,将每个配置文件属性的值传递到一个 SQL 存储过程的一个单独参数内。该选项允许存储过程将配置文件属性存储在其最上方,并通过业务逻辑对数据进行转换,然后再存储这些数据。
在将这些示例用于 ASP.NET 项目之前,您必须先将这些示例的代码复制到 App_Code 文件夹中。这些代码是采用 C# 编写的,因此如果您使用 Visual Basic® 语言开发应用程序,需要将这些示例放在 App_Code 文件夹下的某个单独文件夹内。这个单独文件夹必须作为一个代码子目录添加到 web.config 文件中,如下所示:
<compilation debug="true" strict="false" explicit="true"> <codeSubDirectories> <add directoryName="ProfileProvider" /> </codeSubDirectories> </compilation>
通过将该文件夹添加为一个代码子目录,文件夹中的所有 C# 文件都将与 Web 应用程序项目的其他文件分开单独编译。在运行期间,ASP.NET 临时文件夹中将生成该应用程序的两个 DLL 文件。
要让该应用程序与 SqlTableProfileProvider 一同使用,我将新建一个名为 CustomProfile 的表格,该表格中包含了多列以存储用户的姓名、地址全称、电话号码和一个用于确定用户配置文件当前版本的版本号。表格的最后一列还含有作为主关键字的用户的唯一标识符和最近更新的日期。例如,图 3 显示了如何将提供程序添加到配置文件分区。另外您还可以从中发现如何将每个属性添加到属性分区组中。除了 .NET 类型和默认值以外,您还需要在每个属性上指定一个自定义提供程序数据属性。该属性将包含 SQL 表格的列名称和该列的 SQL 类型。
自定义 CreateUserWizard 控件
ASP.NET 2.0 不仅通过内置提供程序来支持其身份验证功能,而且还内置了 Web 控件,用于处理身份验证和授权。这些控件包括 Login、LoginView、PasswordRecovery、LoginStatus、LoginName、CreateUserWizard 和 ChangePassword。CreateUserWizard 控件允许用户在 ASP.NET 应用程序中创建帐户。与提供程序非常类似,这些控件基本上也不需要编写什么代码。要使用 CreateUserWizard 控件或上述任何一个控件,您只需将其从工具箱拖动到任何 ASP.NET 页面或用户控件上即可。
CreateUserWizard 是一种向导控件,要添加该控件只需两个步骤。第一步是“注册新帐户”,要求用户提供有关用户名、密码、电子邮件地址以及安全问题和答案的信息。在某些情况下,web.config 中定义的 Membership 提供程序可能在 requiresQuestionAndAnswer 属性设置为“false”时进行配置。这种情况下,安全问题和安全答案字段将在运行期间隐藏。第二步为“完成”,要求用户确认已创建帐户,并显示一个“完成”按钮。用户单击按钮后将被重定向到 ContinueDestinationPageURL 属性所指定的 URL,或运行一个为按钮的单击事件准备的事件处理程序(如果提供的话)。通常,开发人员会使用 ContinueDestinationPageURL 属性将用户重定向到主页或引用页面。有关 CreateUserWizard 控件的详细信息,请参阅 msdn.microsoft.com/msdnmag/issues/05/10/ExtremeASPNET 和 msdn.microsoft.com/msdnmag/issues/04/11/CuttingEdge。
创建一个注册过程
创建一个自定义用户注册过程有下列几种方法。第一,您可以使用内置的 CreateUserWizard 控件,在“注册新帐户”步骤之前对其进行修改,添加其他操作。第二,您可以将每个步骤转换为导航模板,并根据需要对每个控件步骤进行自定义。这样就可以将用户信息和配置文件信息移动到不同的步骤中,或将所有字段保留在同一步骤内。最后一种方法,您可以使用 Membership API 的 CreateUser 方法创建自己的注册控件。您需要根据应用程序的具体设计和希望添加的自定义级别来选择不同的解决方案。在本示例中,您可以在“注册新帐户”步骤之前新添一个步骤,这样就可以以最少的代码添加自己的配置文件窗体。
新建的步骤会要求用户提交前面提到的每个配置属性的值,但 ProfileVersion 属性除外。要注意的是,UserID 和 LastUpdatedDate 的值由提供程序填充,所以不需要用户提供。当从应用程序设置或 web.config 的其他分区检索值来提交窗体时,将对 ProfileVersion 属性进行填充。有关创建属于自己的配置分区的详细信息,请访问 msdn.microsoft.com/msdnmag/issues/06/06/ConfigureThis。
图 4 显示了属性正在被添加到 Microsoft 事先提供的 SqlTableProfileProvider 中。我们可以使用 Profile sectionGroup 来指定配置文件版本的值。Profile 将在用户帐户创建完毕后立即更新。被定义为 ProfileCommon 的对象将加载用户当前的配置文件属性和值。由于配置文件和用户帐户对于系统来说都是陌生的,因此所有的值均为空。所有的配置文件属性将更新至包含非空值的状态。最后保存 ProfileCommon,从而可使用提供程序将数据写回到数据库。如果不保存 ProfileCommon,ASP.NET 将不知道需要写入数据。
检查配置文件版本
使用 ASP.NET 的一大好处在于它是模块化的。从 ASP.NET 1.0 开始,开发人员就可以为 ASP.NET 创建 HTTP 处理程序或模块。您可以编写 HTTPModule 来检查是否存在某个用户的配置文件以及该配置文件的版本是否正确。如果一个配置文件不存在或其版本错误,您可以强制用户访问集中的配置文件更新页面。
要确定一个用户当前注册的配置文件版本是否正确,您需要使用应用程序的 AuthorizeRequest 方法。在执行此操作时,您自定义的方法会在用户通过身份验证但尚未获得页面的访问权时运行。(见图 5)。由于您无法提取未登录用户的配置文件,因此就需要从检查对象中排除这些请求。您还可以排除那些当前位于 editprofile.aspx 页面上的用户,以防止他们陷入连续重定向的循环中。随后,您将获得第二个注册的配置文件提供程序(即 SqlTableProfileProvider)上 profileVersion 属性的值。您不愿请求提供程序集合中的第一个提供程序,因为除非您显式地将其从提供程序集合中删除,否则该程序将总是作为内置的配置文件提供程序。在提取了应用程序的当前配置文件版本后,要加载用户帐户的配置文件并检查配置文件中的配置文件版本。要执行此项操作,需新建一个 ProfileCommon 对象并根据用户的姓名加载其配置文件。如果用户的配置文件版本低于应用程序的配置文件版本,用户将重定向到 editprofile.aspx 页面。如果两个版本一致,则加载用户试图访问的页面。
在您可以构建应用程序之前,要先确保 web.config 文件已针对 Forms 身份验证进行了配置。如果您未对其进行配置,应用程序将认为您正在使用 machine.config 文件中定义的 Windows® 身份验证。web.config 文件还需要一个位置分区组来拒绝任何未经身份验证的用户访问编辑配置文件页面。同时您还必须添加一个登录控件,以便用户能够登录到站点。控件可以添加到主页上,也可以添加到某个单独的登录页面。将注册链接添加到登录控件是个不错的主意,这样您的用户就可以找到注册页面了。
逐步运行应用程序
让我们来做一个回顾,当用户访问站点并单击要求其创建用户帐户的链接时,会重定向到注册页面并被要求填写其配置文件信息。当用户单击“下一步”时,将被要求输入用户名和密码,随后重定向到默认页面。在每个页面加载期间,HTTPModule 会查看 web.config 文件中指定的配置文件版本是否高于用户的配置文件版本。如果高于用户的版本,则将用户重定向到编辑配置文件页面。否则,用户可以继续浏览页面。
要确保模块工作正常,需要向自定义配置文件表格中添加一列。该列必须设为可接受空值,否则当用户试图浏览某页面时,您将收到一条错误消息。这是因为尚未针对所有用户建立属性,而且属性也尚未添加到 web.config 文件中。添加属性并将配置文件从版本 1 更改为版本 2。当您保存 web.config 文件并登录到站点时,如果不首先更新配置文件,您可能无法浏览任何页面。
使用 web.config 文件存储配置文件版本的一个弊端是,如果您在修改配置文件版本时有用户正在访问网站,则应用程序会重新设置并强制用户退出登录。之后当他们再次尝试登录时,就会被重定向到编辑配置文件页面。考虑到这一点,您可能要创建一个简单的文本文件或 XML 文件来读取配置文件的版本号。
下一步该怎么做?
如果您需要一些入门的帮助和指导,可以下载我整理的 Visual Studio® Installer (VSI) 项目。该项目中包含了用 Visual Basic 和 ASP.NET 编写的全部源代码,并为您开始编写自己的应用程序提供了丰富的基础知识和内容。您可以从 MSDN® Magazine 网站下载这些内容。对于自定义 ASP.NET 2.0 配置文件提供程序,我也仅了解一些皮毛,相信通过自己的探索您会发现更多的精彩之处。这就是 .NET 的强大之处,让您感觉就像拥有了属于自己的个人工具箱。
如果想了解更多相关信息以及详细咨询,欢迎点击中英网http://www.uker.net/,或发email至:echo@uker.net,UKer.net资深编辑将为您详细解答。
网友评论