适用于:
Microsoft ASP.NET 2.0
Microsoft Visual Studio 2005
Microsoft Internet 信息服务
摘要:Peter Kellner 就创建应用程序来管理 Microsoft ASP.NET 2.0 成员身份数据库写了两篇文章,这是第一篇。本文主要论述如何保证解决方案的安全性以确保只有适合的管理员才能访问这些数据。
摘要
本系列由两篇文章组成,论述如何安全使用和设置用于管理 ASP.NET Membership 与 Roles 的三层解决方案,本文是第一篇。本文将主要论述如何配置、使用以及(最重要的是)保证此解决方案的安全性,并概述如何将其在典型的 Microsoft ASP.NET 2.0 Web 解决方案中实现。Membership 和 Roles 对象被视为可运作,而不用深究其内部结构。管理 Members 和 Roles 似乎与管理简单数据源中的数据无异。在第二篇文章中,将详细说明这些控件和对象的内部结构,以便开发人员能够使用类似的技术创建自己的控件和对象。
简介
ASP.NET 2.0 将用户身份验证直接扩展到了应用程序编程领域。使用标准的 .NET 库引用 (system.web.security),开发人员只需另外进行非常少的工作就可以为其应用程序创建完全身份验证。请记住,必须执行必要的操作以尽可能保证创建的应用程序在使用期间的安全性。
本文概述了安全机制并显示了示例安全设置,这些设置是为 Web 应用程序创建安全环境的基本要素。ASP.NET 2.0 提供了许多不同的配置选项,这些选项是否必要取决于安全要求。本文将介绍这些配置选项的优缺点。
安全性注意事项
保证物理环境的安全性
人们常说,计算机的安全性由计算机前端面板上的电源开关来决定。无论操作系统级别对系统的保护有多么严密,物理保护都是最基本的。所以必须假定任何有权以物理方式访问计算机的用户始终能够以某种方式危害计算机的完整性。
保证域环境的安全性
必须遵循设置用户帐户、密码和权限的最佳做法。例如,如果不具有相应权限的用户能够直接访问包含 Web 应用程序所用的安全数据的数据库,则该应用程序可能会受到危害。
保证 .NET 环境的安全性
.NET 环境允许设置代码访问安全性。这意味着各个系统和应用程序库可以与不同的信任级别相关联。这在某些环境中是非常重要的,例如,可以运行多个 Web 应用程序的共享宿主环境。可能由不同用户拥有的每个 Web 应用程序可能会要求彼此隔离与保护。此外,如果不进行这种隔离,每个 Web 应用程序都可能影响关键的系统功能。
本文假定 ASP.NET 用户(IIS 代表该用户运行)以最高信任级别运行。这就好像 Web 应用程序在专门环境中运行一样。
ASP.NET 与 IIS 的关系
在与 IIS 配合工作时,ASP.NET 支持三种身份验证提供程序:Forms 身份验证(使用应用程序特定的逻辑)、Passport 身份验证(由 Microsoft 提供的集中身份验证服务)和 Windows 身份验证(使用直接通过 IIS 提供的身份验证)。本文使用的是 ASP.NET 项目的默认身份验证:Forms 身份验证。身份验证模式在 web.config 文件中指定。语法选择如下。
<authentication mode = "{Windows|Forms|Passport|None}">
</authentication>
流程图中描述了用户从 Web 客户端登录时要遵循的流程。
请记住,这篇文章编写于 2001 年,当时的流程是相应于 IIS 5.1 而言的,而不是目前的 IIS 6.0 或更高版本。
图 1:IIS 与 ASP.NET 之间的安全流程
ASP.NET 2.0 网站中基于角色的安全性
初始安装与配置
web.config 文件/不常改动项
web.config 文件中设置了一些影响 ASP.NET 2.0 Web 应用程序总体运行情况的参数。示例参数包括,对成员身份提供程序(或数据库)的引用、所需密码强度以及是否要求注册电子邮件。下面显示了 web.config 文件中的相关部分,其中包含最低安全性配置值示例。详细信息可通过以下方式获得:访问 Visual Studio 2005 帮助,然后查阅“Membership Members”。每个安全性参数在此均有详细说明。
<providers>
<remove name="AspNetSqlMembershipProvider"/>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,
System.Web, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
minRequiredPasswordLength="1"
minRequiredNonalphanumericCharacters="0"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
commentTimeout=""/>
</providers>
除了上面显示的 web.config 文件部分外,machine.config 文件中包含与 Membership 关联的数据库的默认连接字符串。可以在 web.config 文件中配置一个不同的连接字符串。要添加附加安全性,可以编码连接字符串,并可以加密 Membership 数据库密码。许多文章已针对这些折衷方法进行了论述。Microsoft 的快速入门指南(英文)中提供了有关如何在 web.config 文件中使用加密的很好的示例。
web.config 文件/.aspx 页面安全性
可以为 Web 应用程序中的每个网页指定一个安全级别。通过指定访问页面所需具备的角色即可执行此操作。web.config 文件中的语法非常简单。例如,以下 web.config 片段指定了只有角色被指定为 Administrator 的用户才能访问网页 MembershipGrid.aspx。
<system.web>
<location path="MembershipGrid.aspx" >
<system.web>
<authorization >
<allow roles="Administrators"/>
</authorization>
</system.web>
</location>
</system.web>
又例如,要指定只有特定角色才能访问某个子目录中的所有页面,则 web.config 文件如下。在本示例中,只有角色被指定为 Administrator 的用户才能访问 ~/AdminDir 路径中的所有文件。
<system.web>
<location path="AdminDir" >
<system.web>
<authorization >
<allow roles="Administrators"/>
</authorization>
</system.web>
</location>
</system.web>
web.config 文件/内部 .aspx 页面安全性
很多时候,需要提供比上述更精确的安全性。也就是说,可能需要对控件(例如按钮)或 aspx 页面提供保护。为此,需要以编程方式更改与会受影响的控件关联的属性。例如,如果需要根据用户角色隐藏某个删除按钮,则需要执行两步操作:首先,应该把名为 ShowButtonBasedOnRole 的方法添加到网页的 codebehind 类。如果用户具备要求的角色,将返回 true;如果用户不具备要求的角色,将返回 false。
protected bool ShowButtonBasedOnRole(string RoleOfInterest)
{
return User.IsInRole(RoleOfInterest);
}
然后,在实际 aspx 页面上,基于内含代码方法 ShowButtonBasedOnRole 来设置该按钮的可见性属性。该按钮的实际声明大致如下。
<asp:Button ID="Button1" runat="server" Text="按钮" Visible='<%# (bool) ShowDeleteRowBasedOnRole("administrator") %>'> />
如果按钮基于所设置的多个角色中的任何一个,则传入参数可更改为字符串,并且在返回用户是否被指定为其中某个角色的答案之前,将检查所有这些角色。
使用成员/角色管理器 aspx 页面
要使用本项中包含的 aspx 页面 (Membership.aspx),需要执行以下几步操作。首先,需要复制文章项目文件中的两个数据类并将它们包含在目标项目的 app_code 目录中。这两个文件为 MembershipDataObject.cs 和 RoleDataObject.cs。然后,需要将 aspx 文件 Membership.aspx 及其内含代码页面 Membership.aspx.cs 移到当前项目中。
一定要对此页面提供保护,以防止任何未被指定为 Administrator 角色的用户访问它。否则,任何用户都能够修改其他用户的登录信息。为此,请确保 Membership.aspx 页面在 web.config 文件中受到保护。web.config 文件中用来实现此目的的示例行如下。
<system.web>
<location path="Membership.aspx" >
<system.web>
<authorization >
<allow roles="Administrators"/>
</authorization>
</system.web>
</location>
</system.web>
由于此页面受到了保护,因此当前登录的用户帐户必须被指定为 Administrator 角色才能访问此页面。
实现此目的的最好方法是执行一次下面的代码,然后从 Web 服务器中删除该代码。例如,可以在 ASP.NET 网页的页面加载事件中执行。然后在调用此页面之后,从服务器中将其删除。这样,只有使用密码登录帐户 admin 才能访问 Membership Management 页面。
Roles.CreateRole("Administrator");
Roles.CreateRole("User");
Roles.CreateRole("Guest");
Membership.CreateUser("admin", "在此输入强密码");
Roles.AddUserToRole("admin", "Administrator");
结论
设置任何网站时,都务必确认将使用该网站的用户并了解他们的相关安全性要求。例如,如果网站将供公司的内部组使用,不会有外部用户访问,且不包含敏感数据,那么配置简单安全性就足够了。即,不需要加密、松散密码约束等。身份验证可以作为跟踪输入数据的用户身份的一种便利方法。反之,如果网站在 Internet 上并且会处理机密数据,则一定要尽可能锁定该网站,仅允许通过身份验证的用户进行访问。
本文简要介绍了在设置 ASP.NET 网站的安全性时需要注意的事项,说明了如何添加安全页面来修改登录到网站的用户的 Membership 和 Role 信息。本系列由两篇文章组成,下一篇文章将假定读者已了解开发网站时设置安全性方面的问题,并将详细介绍 Membership Management 页面的工作方式。
作者简介
Peter Kellner 于 1990 年创办了 73rd Street Associates,在此成功地为全国 500 多家客户提供了有关大学医务室调度、保险公司管理和一站式医生诊所管理的系统。十年后(即 2000 年),一家大型保险公司收购了 73rd Street Associates,于是 Peter 开始了作为独立软件顾问的新职业生涯。目前,他涉及的技术中包括 ASP.NET、Oracle、Java、VOiP,很快会包括 SQL Server。 不工作时,Peter 将他的大部分空闲时间花在骑车旅行上。他已骑车周游了全世界。最近,他和妻子 Tammy 只用了 27 天就完成了从美国加利福尼亚州骑车到乔治亚州的旅程。
他的博客站点为 http://peterkellner.net/。您可以在下载区域找到本文和所列的代码。