日期:2013-11-23  浏览次数:20552 次

使用更精简的代码保证 ASP.NET 应用程序的安全
Michele Leroux Bustamante
IDesign:.NET Design and Business Solutions

2003 年 10 月

适用于:
Microsoft® ASP.NET Whidbey

摘要:学习 ASP.NET Whidbey 及其新的配置工具、控件和组件如何支持用于验证用户和管理受保护资源的完整系统。

下载 ASPNETWhidbeySecuritySample.msi。(请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解。)

目录
直观易用的功能
配置界面
拖放安全控件
按角色过滤内容
成员身份和角色提供程序
但是,这个程序是可扩展的吗?
小结

注意:相应的软件产品正式发行之前,本文档已经撰写完毕,所以我们不能保证本文档内涉及的细节与最终产品完全一致。文中信息描述的是本文档发布之时的产品,仅供在规划时参考之用。如有更改,恕不另行通知。
我编译了许多 Microsoft® ASP.NET 应用程序,例如客户端应用程序和原型、我自己不断增长的站点和帮助不会编程的家人和朋友所开发的站点,以及文章、演示文稿和培训课程的代码。我经常发现自己在编译每个应用程序时,总有某些重复的任务要做,这其中很大一部分是定义验证模型。保护应用程序资源几乎是设计任何应用程序时必不可少的一项工作。ASP.NET 1.x 让事情变得简单了些,它提供了一个颇为简单和安全的、基于表单的验证进程,但您仍要纠缠于角色管理和其他工作之中。如果每设计一个新登录表单可以挣 5 美分,那么我现在至少已经挣了 10 多美元,算一算,我设计了多少个表单。即将发行的新版本 ASP.NET 的开发代号是“Whidbey”(与即将发行的新版本 Microsoft® Visual Studio® .NET 的开发代号一致),它提供了许多新的配置工具、控件和组件,以支持用于验证用户和管理受保护资源的完整系统。这些新功能十分直观易用,即使您的祖母也能在一天内构建一个安全站点。

直观易用的功能
按照传统做法,为新 Web 站点构建一个验证模型通常包括以下步骤:

收集受保护资源和活动的要求,并定义适当的角色和权限。
设计关系数据库表,以存储用户、角色及相关权限。
设计登录页面。
编写代码,以验证用户并收集关联的角色和权限。
添加配置,以基于角色来保护 Web 资源。
编写代码,以基于角色和权限来控制页面内容。
即使只是构建几个可重复使用的组件来封装上述某些重复性任务,您仍会感到肩上的工作负担减轻了不少。ASP.NET Whidbey 的新组件大大减少了上述步骤中的五个步骤的工作量,至少将其减少为了原来工作量的一部分。我将使用新的基于 Web 的管理向导来自动创建一组表,以处理用户、角色和权限。在同一个管理界面中,我还会就登录、成员身份和角色管理对应用程序进行配置。我将在一秒钟(或者说仅仅是在 Web 表单中拖放一个登录控件的时间)之内设计出一个登录页面,而且我根本不用编写一行用于验证用户或关联角色的代码,因为这些会自动完成。根据用户角色和登录状态的不同,呈现的菜单和页面内容也将不同,但我同样无需为此编写任何代码。

是不是有梦想成真的感觉?让我们看看这是如何实现的。

配置界面
ASP.NET Whidbey 包括一个新的基于 Web 的配置工具,它运行于特定应用程序的上下文中,这样便可以通过交互的方式来修改应用程序自身的 web.config 文件。该工具带有许多向导,其中一个可以引导您完成设置安全选项的全部步骤。使用 Visual Studio“Whidbey”完成新 Web 站点的创建后,您可以通过两种方法启动该配置工具:从“Solution Explorer”(解决方案资源浏览器)中选择“ASP.NET Configuration”(ASP.NET 配置)图标或从“Website”(站点)菜单中选择“ASP.NET Configuration”(ASP.NET 配置)。



图 1:从“Solution Explorer”(解决方案资源浏览器)或主菜单启动基于 Web 的配置实用工具。

配置 Web 界面启动时会显示一个查询字符串,指示要配置的应用程序目标。在本文中,我创建了一个名为“MySecureNewsletter”的新应用程序,并启动了管理界面,如下所示:



图 2:在我的计算机上启动管理界面的 URL 是 http://localhost:10245/ASP.NETWebAdminFiles/default.aspx?applicationPhysicalPath=H:\WebSites\MySecureNewsletter\&applicationUrl=/MySecureNewsletter。

“Security”(安全)选项卡中的一个选项是运行“Security Setup Wizard”(安全设置向导)。对于一个新应用程序,应当首先运行该向导。向导界面的左侧面板显示了将要逐步执行的步骤列表,并指出您当前所在的步骤:



图 3:安全设置向导使用 ASP.NET Whidbey 的某些其他很酷的功能,例如用于导航的向导控件。

设置过程中的步骤非常简单,所以在此仅概述我为示例应用程序所选的选项。首先,向导询问我该站点是 Intranet 站点还是 Internet 站点。前者默认使用 Windows 验证,后者(也是我的选择)将把应用程序配置为使用表单验证。下一步,向导显示创建数据库以存储用户和角色的选项。如果选择此选项,向导将询问我是选择创建 Microsoft Access 数据库还是创建 Microsoft SQL Server™ 数据库,然后引导我完成几个附加的步骤。我没有选择这个选项,所以在应用程序的 \Data 目录下将创建一个默认的 Access 数据库。在 machine.config 文件中,<connectionString> 元素指定了 Access 数据库的默认位置:

<connectionStrings>
<add name="LocalSqlServer" connectionString="data
source=127.0.0.1;Integrated Security=SSPI" />
<add name="AccessFileName"
connectionString="~\DATA\ASPNetDB.mdb" />
</connectionStrings>

下一步,我启用了该应用程序的角色管理。此时,将创建带有大量表格的默认 Access 数据库,并且最终将由新的安全控件和成员身份 API 来使用这些表。此时,我可以选择创建角色和用户。创建每个角色时都需要使用简单的字符串值,如下所示:



图 4:界面左侧的向导面板显示我正在对应用程序的安全模型执行哪一步设置。

要创建用户,需要设想一下您可能希望为每个用户收集哪些字段,特别是用户名、密码、电子邮件、说明和可选密码问题及答案。如果已创建了任何角色,则这些角色显示为复选框选项的形式以供选择:



图 5:此处输入的电子邮件字段以后将用于与用户进行交互,例如在用户取回密码时。

通过以上几个简单的步骤,我们已在 \Data 目录下创建了一个新数据库(文件名为 AspNetDB.mdb),用于存储成员身份信息。刷新“Solution Explorer”(解决方案资源浏览器)以后,您还可以看到已创建了一个 web.config 文件,用于启用 <roleManager> 设置中的角色管理。这一步是必需的,因为 machine.config 中的默认设置是禁用角色管理。新的 web.config 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<roleManager enabled="true">
<providers />
<