| 本章内容 | |
| 目标 | |
| 适用范围 | |
| 如何使用本章内容 | |
| 开始之前 | |
| ASP.NET 到 SQL Server | |
| ASP.NET 到企业服务到 SQL Server | |
| ASP.NET 到 Web 服务到 SQL Server | |
| ASP.NET 到 Remoting 到 SQL Server | |
| 将原调用方传递到数据库 | |
| 总结 |
就基于 Intranet 的 Web 应用程序而言,我们不能仅仅因为它在受控制的网络之中、而且只可由一组有限的用户访问而忽视它的安全性。不同的个人和部门可能要求对应用程序提供的功能和数据拥有不同的访问级别,同时必须保证机密数据在传输期间的安全。由于应用程序的安全体系结构必须对将要部署它的 Intranet 的现有基础结构和操作特点所引起的相关安全问题加以考虑,因此这使得事情变得更为复杂。
本章将重点介绍一些常用的分布式应用程序体系结构的要求,以此说明如何解决基于 Intranet 的 Web 应用程序的身份验证、授权和安全通信的问题。
本章的目标是:
| • | 保护 Intranet .NET 应用程序的安全。 | ||||||||
| • | 了解在下列方案中使用 ASP.NET Web 应用程序与 SQL Server 2000 通信时可能存在的安全问题以及建议使用的解决方案:
| ||||||||
| • | 确定在基于 Intranet 的分布式 Web 应用程序中实现身份验证、授权和安全通信的最佳方法。 |
本章适用于以下产品和技术:
| • | Windows XP 或 Windows 2000 Server (Service Pack 3) 以及更高版本的操作系统 |
| • | Microsoft Internet 信息服务 (IIS) 5.0 以及更高版本 |
| • | Microsoft Active Directory |
| • | .NET Framework 版本 1.0 (Service Pack 2) 和更高版本 |
| • | SQL Server 2000 (Service Pack 2) 以及更高版本 |
若要学好本章内容:
| • | 您必须具有开发和配置 ASP.NET、SQL Server 和 IIS 的经验。 | ||||||||||||||||||
| • | 您必须具有配置 Windows 安全性和 Active Directory 的经验。 | ||||||||||||||||||
| • | 您必须具有配置企业服务 (COM+) 应用程序的经验。 | ||||||||||||||||||
| • | 阅读第 1 章简介。这一章说明了身份验证、授权和安全通信对于分布式 Web 应用程序的重要性。 | ||||||||||||||||||
| • | 阅读第 2 章 ASP.NET 应用程序的安全模型。这一章简要介绍了创建分布式 ASP.NET Web 应用程序所采用的体系结构和技术,并重点说明了身份验证、授权和安全通信在此体系结构中的作用。 | ||||||||||||||||||
| • | 请结合以下章节学习本章,这些章节将举例说明本章所述的技术:
|
对于 Intranet 应用程序来说,其访问权限被限制到一组有限的授权用户(例如,属于某个域的雇员)。虽然 Intranet 设置限制了应用程序的开放程度,但是当您制定身份验证、授权和安全通信等策略时,可能仍要面临一些难题。例如,您可能包含非信任域,因此很难将调用方的安全性上下文和标识传递到系统内的后端资源。另外,您的运行环境可能是包含多种浏览器的复杂环境。因此,更加不便使用通用的身份验证机制。
如果您的 Intranet 中所有计算机均运行 Microsoft® Windows® 2000 或更高版本的操作系统(因此这是一个同类 Intranet),并且域中的用户受信任可进行委派,则可以选择将原调用方的安全性上下文委派到后端。
您还必须考虑安全通信问题。尽管您的应用程序运行在 Intranet 环境中,也不能认为在网络中传送的数据是安全的。除了需要保护应用程序服务器和数据库之间传送的数据外,可能还需要保护浏览器和 Web 服务器之间传送的数据。
本章使用以下常见的 Intranet 方案来阐释主要的身份验证、授权和安全通信技术,包括:
| • | ASP.NET 到 SQL Server |
| • | ASP.NET 到企业服务到 SQL Server |
| • | ASP.NET 到 Web 服务到 SQL Server |
| • | ASP.NET 到 Remoting 到 SQL Server |
此外,本章还介绍了一个 Windows 2000 委派方案(“将原调用方传递到数据库”)。在此方案中,使用中间 Web 服务器和应用程序服务器,在操作系统级别将原调用方的安全性上下文和标识从浏览器传递到数据库。
注意:本章中描述的几个方案将更改默认 ASPNET 帐户的密码,以便在远程计算机上创建用于网络身份验证的重复帐户。这要求更新 Machine.config 的 <processModel> 元素。不应将 <processModel> 凭据以明文形式存储在 machine.config 中,应使用 aspnet_setreg.exe 实用程序将加密后的凭据存储在注册表中。有关详细信息,请参见第 8 章 ASP.NET 安全性和 Microsoft 知识库文章 Q329290 HOWTO: Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings(HOWTO:使用 ASP.NET 工具加密凭据和会话状态连接字符串)。
在此方案中,人力资源数据库在同类 Intranet 中安全地提供每个用户的数据。应用程序使用受信任的子系统模型并代表原调用方执行调用。应用程序使用集成 Windows 身份验证来验证调用方的身份,并使用 ASP.NET 进程标识来调用数据库。由于数据本身所具有的机密性,因此,在 Web 服务器和客户端之间使用了 SSL。
图 5.1 显示此应用程序方案的基本模型。

图 5.1
ASP.NET 到 SQL Server
此方案具有以下特点:
| • | 客户端上安装了 Internet Explorer。 |
| • | 用户帐户位于 Microsoft Active Directory® 目录服务中。 |
| • | 应用程序提供每个用户的机密数据。 |
| • | 只有通过身份验证的客户端才能访问应用程序。 |
| • | 数据库委托该应用程序对用户进行正确的身份验证(即应用程序代表用户对数据库进行调用)。 |
| • | Microsoft SQL Server 使用单个数据库用户角色进行授权。 |
在此方案中,Web 服务器验证调用方的身份,并使用调用方的标识来限制其对本地资源的访问。要限制原调用方对资源的访问,您不必在 Web 应用程序中进行模拟。数据库对 ASP.NET 默认的进程标识(它是权限最少的帐户)进行身份验证(即,数据库信任 ASP.NET 应用程序)。
表 5.1: 安全措施
| 类别 | 详细信息 | ||||||||
身份验证 |
| ||||||||
授权 |
| ||||||||
安全通信 |
|
图 5.2 显示了此方案的建议安全配置。

图 5.2
ASP.NET 到 SQL Server Intranet 方案的建议安全配置
在开始之前,您需要查看以下内容:
| • | 创建自定义 ASP.NET 帐户(请参见本指南中的如何创建自定义帐户来运行 ASP.NET) |
| • | 创建一个权限最少的数据库帐户(请参见第 12 章数据访问安全性) |
| • | 在 Web 服务器上配置 SSL(请参见本指南中的如何在 Web 服务器上设置 SSL) |
| • | 配置 IPSec(请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信) |
| 步骤 | 更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问 启用集成 Windows 身份验证 | 若要使用 IIS 身份验证设置,请使用 IIS MMC 管理单元。右键单击应用程序的虚拟目录,然后单击“属性”。 |
| 步骤 | 更多信息 |
将 ASPNET 密码更改为一个已知的强密码值 | ASPNET 是权限最少的本地帐户,默认情况下用来运行 ASP.NET Web 应用程序。 <!-- userName="machine" password="AutoGenerate" --> 成为 <!-- userName="registry:HKLM\SOFTWARE\YourSecureApp\ processModel\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourSecureApp\ processModel\ASPNET_SETREG,password" --> 请注意,已经使用 aspnet_setreg.exe 实用程序将加密的密码存储在注册表中。 |
配置 ASP.NET Web 应用程序以使用 Windows 身份验证 | 编辑应用程序的虚拟根目录下的 Web.config <authentication mode="Windows" /> |
确保模拟处于关闭状态 | 默认情况下模拟处于关闭状态;不过,请执行如下操作,再次检查以确保它在 Web.config 中是关闭的: <identity impersonate="false" /> 删除 <identity> 元素也能达到同样的效果。 |
| 步骤 | 更多信息 |
在 SQL Server 计算机上创建一个 | 用户名和密码必须与 ASP.NET 帐户匹配。 给予该帐户以下权限: |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为本地 ASPNET 帐户创建一个 SQL Server 登录 | 这将授予对 SQL Server 的访问权限 |
创建一个新数据库用户,并将登录名映射到数据库用户 | 这将授予对特定数据库的访问权限 |
创建一个新的用户定义的数据库角色,并将数据库用户添加到该角色 |
|
设置该数据库角色的数据库权限 | 授予最少的权限 |
| 步骤 | 更多信息 |
配置 Web 站点以使用 SSL | 请参见本指南中的如何在 Web 服务器上设置 SSL。 |
配置 Web 服务器和数据库服务器之间的 IPSec | 请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信。 |
| • | 在此方案中,由于所有用户都使用 Windows 帐户并且使用的是 Microsoft Internet Explorer,所以最好使用 IIS 中的集成 Windows 身份验证。集成 Windows 身份验证的优点是从不通过网络传送用户的密码。此外,由于 Windows 使用当前交互式用户的登录会话,所以对于用户来说登录是透明的。 |
| • | ASP.NET 作为权限最少的帐户运行,因此在出现安全问题的情况下可能会减轻受破坏的程度。 |
| • | 您不必在 ASP.NET 中进行模拟即可针对原调用方执行 .NET 角色检查或在 Windows ACL 中保证资源的安全。为了对原调用方执行 .NET 角色检查,按如下所示从 HTTP 上下文中检索代表原调用方的 WindowsPrincipal 对象: WindowsPrincipal wp = (HttpContext.Current.User as WindowsPrincipal);
if ( wp.IsInRole("Manager") )
{
// 用户被授权执行特定于 manager(经理)的功能
}
ASP.NET FileAuthorizationModule 针对原调用方在 ACL 中检查在 IIS 中映射到 aspnet_isapi.dll 的 ASP.NET 文件类型。对于静态文件类型(例如 .jpg、.gif 和 .htm 文件),IIS 充当网关守卫,它根据文件的相关 NTFS 权限,使用原调用方的标识执行访问检查。 |
| • | 对 SQL Server 使用 Windows 身份验证意味着,不必将凭据存储在文件中并通过网络将凭据传递到数据库服务器。 |
| • | 在数据库服务器上使用重复的 Windows 帐户(与 ASP.NET 本地帐户匹配的帐户)会导致增加管理负担。如果一台计算机上的密码有改动,则必须在其他计算机上同步并更新该密码。在某些方案中,您可能能够使用权限最少的域帐户,以便简化管理。 |
| • | 如果有防火墙(此时 Windows 身份验证所需的端口可能没有打开),重复的本地帐户方法同样奏效。在此方案中可能无法使用 Windows 身份验证和域帐户。 |
| • | 您需要确保 Windows 组的等级与您的安全要求一样。因为基于 .NET 角色的安全性以 Windows 组成员为基础,所以此解决方案需要根据相应层次的 Windows 组来匹配那些访问该应用程序的用户类别(具有相同的安全权限)。这里用来管理角色的 Windows 组可以是此计算机的本地组或域组。 |
| • | SQL Server 数据库用户角色优先于 SQL Server 应用程序角色,这样可以避免由于使用 SQL 应用程序角色而带来的密码管理问题和连接池问题。 有关 SQL Server 数据库用户角色和 SQL Server 应用程序角色的详细信息,请参见第 12 章数据访问安全性。 |
| • | 将数据库用户添加到数据库用户角色中,并且为角色指定了权限,这样,当数据库帐户更改时,您不必更改所有数据库对象的权限。 |
| • | 为什么我不能启用 Web 应用程序模拟,以便使用针对原调用方配置的 ACL 来保护 Web 应用程序所访问的资源? 上述方案使用 ASP.NET FileAuthorizationModule,它使用 Windows ACL 针对原调用方标识执行授权,并且不要求进行模拟。 如果您使用基本身份验证而不是集成 Windows 身份验证 (NTLM),并且确实启用了模拟,则每个数据库调用都将使用原调用方的安全性上下文。每个用户帐户(或用户所属的 Windows 组)都要求使用 SQL Server 登录。需要限制 Windows 组(或原调用方)访问数据库对象的权限以确保安全性。 |
| • | 数据库不知道谁是原始调用方。我如何能创建一条审核记录? |
对 IIS 执行集成 Windows 身份验证时需要使用 Internet Explorer。在混合浏览器环境中,您的典型选项包括:
| • | 基本身份验证和 SSL。大多数浏览器都支持基本身份验证。由于用户的凭据是通过网络传递的,所以必须使用 SSL 来保证此方案的安全。 |
| • | 客户端证书。可以将各个客户端证书映射到唯一的 Windows 帐户,或者使用单个 Windows 帐户来代表所有客户端。如果使用客户端证书,则将要求使用 SSL。 |
| • | 窗体身份验证。窗体身份验证可以根据自定义数据存储(如数据库)或 Active Directory 来验证凭据。 |
请注意,在所有情况下,如果您没有使用集成 Windows 身份验证(其中,由平台管理凭据),就将使用 SSL。不过,此优点仅限于身份验证过程。如果您通过网络传递安全机密数据,则仍须使用 IPSec 或 SSL。
在有些方案中,您可能必须使用 SQL 身份验证而不是首选的 Windows 身份验证。例如,在 Web 应用程序和数据库之间可能设置了防火墙,或者由于安全原因,Web 服务器可能不属于您所在的域。这也会妨碍 Windows 身份验证。这种情况下,您可以在数据库和 Web 服务器之间使用 SQL 身份验证。为保证此方案的安全,您应该:
| • | 使用数据保护 API (DPAPI) 来保护包含用户名和密码的数据库连接字符串的安全。有关详细信息,请参见以下资源:
| ||||||||
| • | 在 Web 服务器和数据库服务器之间,使用 IPSec 或 SSL 来保护通过网络传递的明文凭据。 |
在此方案中,使用原调用方的安全性上下文从 Web 应用程序调用数据库。使用此方法时,一定要注意以下几点:
| • | 如果选择此方法,则需要使用 Kerberos 身份验证(将帐户配置为使用委派)或基本身份验证。
|
| • | 还必须在 ASP.NET 中启用模拟。这意味着使用原调用方的安全性上下文执行本地系统资源访问,因此需要正确地配置本地资源(例如注册表和事件日志)的 ACL。 |
| • | 由于原调用方无法共享连接,因此数据库连接池受到限制。每个连接都与调用方的安全性上下文关联。 |
| • | 另一种传递用户安全性上下文的方法是在应用程序级别传递原调用方的标识(例如,通过使用方法和存储过程参数)。 |
在此方案中,ASP.NET 页面调用企业服务应用程序中驻留的业务组件,而企业服务应用程序又连接到数据库上。例如,假定有一个内部定单系统,它通过 Intranet 进行交易并允许内部部门下定单。图 5.3 中显示了此方案。

图 5.3
ASP.NET 会在企业服务中调用一个组件,该组件将调用该数据库
此方案具有以下特点:
| • | 用户安装了 Internet Explorer。 |
| • | 组件部署在 Web 服务器上。 |
| • | 应用程序处理机密数据,在传输过程中必须保护这些数据的安全。 |
| • | 业务组件使用 Windows 身份验证连接到 SQL Server。 |
| • | 基于调用方的标识来限制这些组件中的业务功能。 |
| • | 将服务组件配置为服务器应用程序(进程外)。 |
| • | 组件使用服务器应用程序的进程标识连接到数据库。 |
| • | 在 ASP.NET 中启用模拟(以便实现企业服务基于角色的安全性)。 |
在此方案中,Web 服务器验证原调用方的身份,并将调用方的安全性上下文传递到服务组件。服务组件基于原调用方的标识授予业务功能的访问权限。数据库根据企业服务应用程序的进程标识进行身份验证(即数据库信任企业服务应用程序中的服务组件)。当服务组件调用数据库时,它在应用程序级别传递用户的标识(通过使用受信任的查询参数)。
表 5.2: 安全措施
| 类别 | 明细 | ||||||||
身份验证 |
| ||||||||
授权 |
| ||||||||
安全通信 |
|
图 5.4 显示了此方案的建议安全配置。

图 5.4
ASP.NET 到本地企业服务到 SQL Server 的 Intranet 方案的建议安全配置
在您开始之前,需要查看以下内容:
| • | 创建一个权限最少的数据库帐户(请参见第 12 章数据访问安全性) |
| • | 在 Web 服务器上配置 SSL(请参见本指南中的如何在 Web 服务器上设置 SSL) |
| • | 配置 IPSec(请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信) |
| • | 配置企业服务安全性(请参见本指南中的如何将基于角色的安全性用于企业服务) |
| 步骤 | 更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问 启用集成 Windows 身份验证 |
|
| 步骤 | 更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 | 编辑应用程序的虚拟根目录下的 Web.config,将 <authentication> 元素设置为: <authentication mode="Windows" /> |
配置 ASP.NET Web 应用程序的模拟功能 | 编辑 Web 应用程序的虚拟目录下的 Web.config <identity impersonate="true" /> |
配置 ASP.NET DCOM 安全性,以确保企业服务调用支持调用方模拟 | 编辑 Machine.config 并找到 <processModel> 元素。确认已将 comImpersonationLevel 属性设置为 Impersonate (默认设置)
<processModel
comImpersonationLevel="Impersonate"
|
| 步骤 | 更多信息 |
创建一个用于运行企业服务的自定义帐户 | 注意:如果使用本地帐户,则还必须在 SQL Server 计算机上创建一个重复的帐户。 |
将企业服务应用程序配置为服务器应用程序 | 这可以通过使用“组件服务”工具,或通过位于服务组件程序集中的以下 .NET 属性进行配置。 [assembly: ApplicationActivation(ActivationOption.Server)] |
配置企业服务 (COM+) 角色 | 使用“组件服务”工具或脚本将 Windows 用户和/或组添加到角色中。 可以使用服务组件程序集中的 .NET 属性来定义角色。 |
将企业服务配置为以自定义帐户运行 | 这必须使用“组件服务”工具或脚本进行配置。不能使用服务组件程序集中的 .NET 属性。 |
| 步骤 | 更多信息 |
在 SQL Server 计算机上创建一个与企业服务进程帐户匹配的 Windows 帐户 | 用户名和密码必须匹配自定义企业服务帐户。 给予该帐户以下权限: |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为企业服务帐户创建一个 SQL Server 登录 | 这将授予对 SQL Server 的访问权限。 |
创建一个新数据库用户,并将登录名映射到数据库用户 | 这将授予对特定数据库的访问权限。 |
创建一个新的数据库用户角色,并将数据库用户添加给该角色 |
|
设置该数据库用户角色的数据库权限 | 授予最少的权限 |
| 步骤 | 更多信息 |
配置 Web 站点的 SSL | 请参见本指南中的如何在 Web 服务器上设置 SSL。 |
配置 Web 服务器和数据库服务器之间的 IPSec | 请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信。 |
| • | ASP.NET 和企业服务作为权限最少的帐户运行,因此在出现安全问题的情况下可能会减轻受破坏的程度。当上述任何一个进程标识出现安全问题时,由于该帐户的权限非常有限,因此缩小了危害的范围。另外,在 ASP.NET 中,如果注入了恶意脚本,也可以限制潜在的危害。 |
| • | 要将原调用方的安全性上下文传递给企业服务组件(以支持基于企业服务 (COM+) 角色的授权),必须配置 ASP.NET 应用程序以支持模拟。如果不进行模拟,则对进程标识(即 ASP.NET 辅助进程)进行角色检查。模拟将影响到谁将获得资源访问权限。 |
| • | 通过使用企业服务 (COM+) 角色,将访问检查推到中间层(业务逻辑所在的位置)进行。在这种情况下,将在入口处检查调用方并将其映射到角色,而且将基于角色调用业务逻辑。这可避免不必要的后端调用。企业服务 (COM+) 角色的另一优点是:可以在部署时使用组件服务管理器创建和管理角色。 |
| • | 对 SQL 的 Windows 身份验证意味着,可以避免在文件中存储凭据并通过网络进行传送。 |
| • | 当设置了防火墙时(此时 Windows 身份验证所需的端口可能没有打开),仍然可以使用本地帐户运行企业服务应用程序,以及在数据库服务器上使用重复的帐户。在此方案中可能无法使用 Windows 身份验证和域帐户。 |
| • | 在数据库服务器上使用重复的 Windows 帐户(一个与企业服务进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。 |
| • | 因为基于 .NET 角色的安全性以 Windows 组成员为基础,所以此解决方案需要根据相应层次的 Windows 组来匹配那些访问该应用程序的用户类别(具有相同的安全权限)。 |
在此方案中,运行 ASP.NET 页的 Web 服务器连接到远程服务器上的 Web 服务。而该服务器又连接到某个远程数据库服务器。例如,假定有一个提供用户特定机密数据的人力资源 Web 应用程序。此应用程序依赖 Web 服务进行数据检索。图 5.5 显示此应用程序方案的基本模型。

图 5.5
ASP.NET 到远程 Web 服务到 SQL Server
Web 服务提供了一种允许各个雇员检索本人详细信息的方法。必须使用 Web 应用程序只给通过身份验证的个人提供详细信息。Web 服务还提供了一种支持检索任何雇员详细信息的方法。只有人力资源或工资部门的成员可以使用此功能。在此方案中,将雇员分为三个 Windows 组:
| • | HRDept (人力资源部门的成员) |
| • | PayrollDept (工资部门的成员) |
| • | Employees(雇员) |
由于数据本身所具有的保密性,应保证所有节点之间通信的安全。
| • | 用户安装了 Internet Explorer 5.x 或更高版本。 |
| • | 所有计算机都运行 Windows 2000 或更高版本。 |
| • | 用户帐户位于单一目录林的 Active Directory 中。 |
| • | 应用程序将原调用方的安全性上下文一直传递到数据库。 |
| • | 所有层都使用 Windows 身份验证。 |
| • | 将域用户帐户配置为使用委派。 |
| • | 数据库不支持委派。 |
在此方案中,驻留 ASP.NET Web 应用程序的 Web 服务器验证原调用方的身份,并将它们的安全性上下文传递到驻留 Web 服务的远程服务器。这样就可以对 Web 方法应用授权检查,以允许或拒绝对原调用方的访问。数据库验证 Web 服务进程标识的身份(数据库信任 Web 服务)。Web 服务反过来调用数据库,并使用存储过程参数在应用程序级别传递用户的标识。
表 5.3: 安全措施
| 类别 | 明细 | ||||||||
身份验证 |
| ||||||||
授权 |
| ||||||||
安全通信 |
|
图 5.6 显示了此方案的建议安全配置。

图 5.6
ASP.NET 到 Web 服务到 SQL Server 的 Intranet 方案的建议安全配置
在开始之前,您需要查看以下内容:
| • | 在 Web 服务器上配置 SSL(请参见本指南中的如何在 Web 服务器上设置 SSL) |
| • | 配置 IPSec(请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信) |
| 配置 IIS | |
| 步骤 | 更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问 对 Web 应用程序的虚拟根目录启用 Windows 集成身份验证 |
|
| 配置 ASP.NET | |
| 步骤 | 更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 | 编辑 Web 应用程序的虚拟目录下的 Web.config。将 <authentication> 元素设置为: <authentication mode="Windows" /> |
配置 ASP.NET Web 应用程序的模拟功能 | 编辑 Web 应用程序的虚拟目录下的 Web.config。将 <identity> 元素设置为: <identity impersonate="true" /> |
| 配置 IIS | |
| 步骤 | 更多信息 |
禁用对 Web 服务的虚拟根目录的匿名访问 对 Web 服务的虚拟根目录启用 Windows 集成身份验证 |
|
| 配置 ASP.NET | |
| 步骤 | 更多信息 |
将 ASPNET 密码更改为一个已知值 | ASPNET 是权限最少的本地帐户,默认情况下用来运行 ASP.NET Web 应用程序。 <!-- userName="machine" password="AutoGenerate" --> 成为 <!--userName="registry:HKLM\SOFTWARE\YourSecureApp\ processModel\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourSecureApp\ processModel\ASPNET_SETREG,password" --> 注意,已经使用 aspnet_setreg.exe 实用程序将加密的密码存储在注册表中。 |
将 ASP.NET Web 服务配置为使用 Windows 身份验证 | 编辑 Web 服务的虚拟目录下的 Web.config。将 <authentication> 元素设置为: <authentication mode="Windows" /> |
确保模拟处于关闭状态 | 默认情况下模拟处于关闭状态;不过,请执行如下操作,再次检查以确保它在 Web.config 中是关闭的: <identity impersonate="false" /> 注意,由于默认情况下禁用模拟,因此通过删除 <identity> 元素可以达到同样的效果。 |
| 步骤 | 更多信息 |
在 SQL Server 计算机上创建一个 Windows 帐户, | 用户名和密码必须匹配自定义 ASP.NET 帐户。 给予该帐户以下权限: |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为自定义 ASP.NET 帐户创建一个 SQL Server 登录 | 这将授予对 SQL Server 的访问权限。 |
创建一个新数据库用户,并将登录名映射到数据库用户 | 这将授予对特定数据库的访问权限。 |
创建一个新的数据库用户角色,并将数据库用户添加给该角色 |
|
设置该数据库用户角色的数据库权限 | 授予最少的权限 |
| 步骤 | 更多信息 | |
在 Web 服务器上配置网站的 SSL | 请参见本指南中的如何在 Web 服务器上设置 SSL。 | |
配置 Web 服务器和数据库服务器之间的 IPSec | 请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信。 |
| • | 在此方案中,IIS 中的集成 Windows 身份验证是理想的选择。这是因为,所有用户都使用 Windows 2000 或更高版本、Internet Explorer 5.x 或更高版本,并且都使用 Active Directory 帐户,因此具备了使用 Kerberos 身份验证协议(其支持委派)的条件。这样,您就可以跨计算机边界传递用户的安全性上下文。 |
| • | 在 Active Directory 中,不能将最终用户帐户标记为“敏感,不能被委派”。在 Active Directory 中,必须将 Web 服务器计算机帐户标记为“可以委派其他帐户”。有关详细信息,请参见本指南中的如何为 Windows 2000 实现 Kerberos 委派。 |
| • | Web 服务器和应用程序服务器上的 ASP.NET 作为权限最少的本地帐户(本地 ASPNET 帐户)运行,因此在出现安全问题的情况下可能会减轻受破坏的程度。 |
| • | 将 Web 服务和 Web 应用程序均配置为使用 Windows 身份验证。将两台计算机上的 IIS 均配置为使用集成 Windows 身份验证。 |
| • | 从 Web 应用程序调用 Web 服务时,默认情况下不传递凭据。要响应下游 Web 服务器上 IIS 发出的网络身份验证质询,必须使用凭据。必须使用以下方法设置 Web 服务代理的 Credentials 属性以明确地指定这一点: wsproxy.Credentials = CredentialCache.DefaultCredentials; 有关使用凭据调用 Web 服务的详细信息,请参见第 10 章 Web 服务安全性。 |
| • | 将 Web 应用程序配置为使用模拟。因此,在从 Web 应用程序调用 Web 服务时,就会传递原调用方的安全性上下文,并且允许 Web 服务对原调用方进行身份验证(和授权)。 |
| • | 在 Web 服务中使用 .NET 角色并基于用户所属的 Windows 组(HRDept、PayrollDept 和 Employees)来对用户进行授权。HRDept 和 PayrollDept 的成员可以检索任何雇员的详细信息,而 Employees 组的成员仅有权检索他们自己的详细信息。
[WebMethod]
[PrincipalPermission(SecurityAction.Demand,
Role=@"DomainName\HRDept)]
public DataSet RetrieveEmployeeDetails()
{
}
上述代码中显示的属性表示,只允许 DomainName\HRDept Windows 组的成员调用 RetrieveEmployeeDetails 方法。如果任何不属于该组的成员试图调用此方法,就会发生安全异常情况。 |
| • | ASP.NET 文件授权(在 Web 应用程序和 Web 服务中)针对调用方在 ACL 中检查是否存在以下文件类型:IIS 元数据库中的某个映射将该文件类型映射到 Aspnet_isapi.dll。IIS 检查不存在 ISAPI 映射的静态文件类型(例如 .jpg、.gif、.htm 等),而且检查是同样使用附加到文件的 ACL。 |
| • | 因为已将 Web 应用程序配置为使用模拟,所以必须用 ACL 来配置应用程序本身所访问的资源,以便给原调用方至少授予读取权限。 |
| • | Web 服务不使用模拟或委派;因此,它使用 ASP.NET 进程标识来访问本地系统资源和数据库。结果,所有调用都是使用单个进程帐户完成的。因此,可以使用数据库连接池。如果数据库不支持委派(例如 SQL Server 7.0 或更低版本),则此方案就是个理想的选择。 |
| • | 对 SQL Server 的 Windows 身份验证意味着您可以避免在 Web 服务器上存储凭据,也意味着不必通过网络将凭据发送到 SQL Server 计算机。 |
| • | 原调用方和 Web 服务器之间的 SSL 保护向 Web 应用程序传递的以及从中发出的数据。 |
| • | 下游 Web 服务器和数据库之间的 IPSec 保护传递到数据库的以及从中发出的数据。 |
| • | 在数据库服务器上使用重复的 Windows 帐户(一个与 ASP.NET 进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。 |
| • | 因为基于 .NET 角色的安全性以 Windows 组成员为基础,所以此解决方案需要根据相应层次的 Windows 组来匹配那些将要访问该应用程序的用户类别(具有相同的安全权限)。 |
| • | Kerberos 委派是不受限制的,因此必须严格控制在 Web 服务器上运行的应用程序标识。为了提高安全性,应从“域用户”组中删除域帐户以限制域帐户的访问范围,并且只允许从有关的计算机进行访问。有关详细信息,请参见 Microsoft 网站 http://www.microsoft.com/windows2000/techinfo/planning/security/secdefs.asp 上的 Default Access Control Settings(默认访问控制设置)白皮书。 |
数据库不知道谁是原始调用方,我如何创建一条审核记录?
审核 Web 服务中的最终用户活动,或者将用户标识作为数据访问调用的参数进行明文传递。
如果您需要连接到非 SQL Server 数据库,或者目前使用的是 SQL 身份验证,则必须使用连接字符串明文传递数据库帐户凭据。如果您这样做,请确保安全地存储连接字符串。
有关详细信息,请参见第 12 章数据访问安全性中的安全存储数据库连接字符串。
在此方案中,运行 ASP.NET 页的 Web 服务器安全地连接到远程应用程序服务器上的远程组件。Web 服务器使用 .NET Remoting 在 HTTP 通道上与该组件进行通信。远程组件驻留在 ASP.NET 中。图 5.7 显示了此方案。

图 5.7
ASP.NET 到使用 .NET Remoting 的远程处理到 SQL Server
| • | 用户使用不同类型的 Web 浏览器。 |
| • | 远程组件由 ASP.NET 承载。 |
| • | Web 应用程序使用 HTTP 通道与远程组件进行通信。 |
| • | ASP.NET 应用程序调用 .NET 远程组件,并传递原调用方的凭据以进行身份验证。基本身份验证提供了这些功能。 |
| • | 由于数据本身所具有的机密性,必须保证数据在各进程与各计算机之间的安全。 |
在此方案中,承载 ASP.NET Web 应用程序的 Web 服务器验证原调用方的身份。Web 应用程序可以从 HTTP 服务器变量中检索调用方的身份验证凭据(用户名和密码)。然后,Web 应用程序通过配置远程组件代理,使用这些凭据连接到承载远程组件的应用程序服务器。数据库使用 Windows 身份验证来验证 ASP.NET 进程标识的身份(即,数据库信任远程组件)。远程组件反过来调用数据库,并使用存储过程参数在应用程序级别传递原调用方的标识。
表 5.4: 安全措施
| 类别 | 明细 | ||||||
身份验证 |
| ||||||
授权 |
| ||||||
安全通信 |
|
图 5.8 显示了此方案的建议安全配置。

图 5.8
ASP.NET 到远程 Web 服务到 SQL Server 的 Intranet 方案的建议安全配置
在开始之前,您需要查看以下内容:
| • | 创建一个权限最少的数据库帐户(请参见第 12 章数据访问安全性) |
| • | 在 Web 服务器上配置 SSL(请参见本指南中的如何在 Web 服务器上设置 SSL) |
| • | 配置 IPSec(请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信) |
| 配置 IIS | |
| 步骤 | 更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问 启用基本身份验证 |
|
| 配置 ASP.NET | |
| 步骤 | 更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 | 编辑应用程序的虚拟根目录下的 Web.config,将 <authentication> 元素设置为: <authentication mode="Windows" /> |
| 配置 IIS | |
| 步骤 | 更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问 启用集成 Windows 身份验证 |
|
将(ASP.NET 中的)远程组件配置为使用 Windows 身份验证 | 编辑远程组件的虚拟根目录下的 Web.config <authentication mode="Windows" /> |
将 ASPNET 密码更改为一个已知值 | ASPNET 是权限最少的本地帐户,默认情况下用来运行 ASP.NET Web 应用程序(此处用于运行远程组件主机进程)。 <!-- userName="machine" password="AutoGenerate" --> 成为 <!-- userName="registry:HKLM\SOFTWARE\YourSecureApp\ processModel\ASPNET_SETREG,userName" password="registry:HKLM\SOFTWARE\YourSecureApp\ processModel\ASPNET_SETREG,password" --> 注意,已经使用 aspnet_setreg.exe 实用程序将加密的密码存储在注册表中。 |
确保模拟处于关闭状态 | 默认情况下模拟处于关闭状态;不过,请执行以下操作,再次检查以确保它在 web.config 中是关闭的: <identity impersonate="false" /> 删除 <identity> 元素也能达到同样的效果。 |
| 步骤 | 更多信息 |
在 SQL Server 计算机上创建一个 Windows 帐户, | 用户名和密码必须匹配自定义 ASP.NET 帐户。 给予该帐户以下权限: |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为自定义 ASP.NET 帐户创建一个 SQL Server 登录 | 这将授予对 SQL Server 的访问权限 |
创建一个新数据库用户,并将登录名映射到数据库用户 | 这将授予对特定数据库的访问权限 |
创建一个新的数据库用户角色,并将数据库用户添加给该角色 |
|
设置该数据库用户角色的数据库权限 | 授予最少的权限 |
| 步骤 | 更多信息 |
在 Web 服务器上配置网站的 SSL | 请参见本指南中的如何在 Web 服务器上设置 SSL。 |
在应用程序服务器上配置网站的 SSL | 请参见本指南中的如何在 Web 服务器上设置 SSL。 |
配置应用程序服务器和数据库服务器之间的 IPSec | 请参见本指南中的如何使用 IPSec 在两个服务器之间进行安全通信。 |
| • | Web 服务器和应用程序服务器上的 ASP.NET 作为权限最少的本地帐户运行,因此在出现安全问题的情况下可能会减轻受破坏的程度。在上述两种情况下,均使用默认的 ASPNET 帐户。 |
| • | 在 Web 服务器上,基本身份验证允许 Web 应用程序使用用户的凭据响应来自应用程序服务器的 Windows 身份验证质询。
string pwd = Request.ServerVariables["AUTH_PASSWORD"];
string uid = Request.ServerVariables["AUTH_USER"];
IDictionary channelProperties =
ChannelServices.GetChannelSinkProperties(proxy);
NetworkCredential credentials;
credentials = new NetworkCredential(uid, pwd);
ObjRef objectReference = RemotingServices.Marshal(proxy);
Uri objectUri = new Uri(objectReference.URI);
CredentialCache credCache = new CredentialCache();
credCache.Add(objectUri, "Negotiate", credentials);
channelProperties["credentials"] = credCache;
channelProperties["preauthenticate"] = true;
有关将安全凭据传递到远程组件的详细信息,请参见第 11 章 .NET Remoting 安全性。 |
| • | 在 ASP.NET Web 应用程序中禁止使用模拟,因为远程处理是使用基本身份验证获取的用户凭据专门配置的。Web 应用程序所访问的任何其他资源均使用 ASP.NET 进程帐户提供的安全性上下文。 |
| • | 用户和 Web 服务器之间的 SSL 保护传递到或来自 Web 服务器的数据,并且还保护在身份验证过程中以明文传递的基本凭据。 |
| • | 在应用程序服务器上,集成 Windows 身份验证提供对原调用方的 .NET 角色检查。角色对应于 Windows 组。 即使没有模拟,也可以执行基于角色的检查。 |
| • | ASP.NET 文件授权针对调用方在 ACL 中检查是否存在以下文件类型:IIS 元数据库中的某个映射将该文件类型映射到 Aspnet_isapi.dll。IIS 对静态文件(在 IIS 中没有映射到 ISAPI 扩展)执行访问检查。 |
| • | 因为在应用程序服务器上没有启用模拟,所以远程组件执行的任何本地或远程资源访问均使用 ASPNET 安全性上下文执行。应该相应地设置 ACL。 |
| • | 对 SQL Server 的 Windows 身份验证意味着您可以避免在应用程序服务器上存储凭据,也意味着不必通过网络将凭据发送到 SQL Server 计算机。 |
| • | 在数据库服务器上使用重复的 Windows 帐户(一个与 ASP.NET 进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。 |
| • | 因为基于 .NET 角色的安全性以 Windows 组成员为基础,所以此解决方案需要根据相应层次的 Windows 组来匹配那些将要访问该应用程序的用户类别(具有相同的安全权限)。 |
Web 服务器使用 Kerberos 来验证调用方的身份。使用 Kerberos 委派将原调用方的安全性上下文传递到应用程序服务器上的远程组件。
此方法要求将所有用户帐户配置为使用委派。还将 Web 应用程序配置为使用模拟,并且 Web 应用程序使用 DefaultCredentials 来配置远程组件代理。第 11 章 .NET Remoting 安全性中的传递原调用方部分深入讨论了这种技术。
前面讨论的方案使用了受信任的子系统模型,并且在所有情况下,数据库都信任应用程序服务器或 Web 服务器以便正确地对用户进行身份验证和授权。虽然受信任的子系统模型具有许多优点,但是某些方案(多半是出于审核原因)可能要求您使用模拟/委派模型,并且跨计算机边界将原调用方的安全性上下文一直传递到数据库。
需要将原调用方传递到数据库的常见原因包括:
| • | 您需要细分数据库访问,并且权限受对象限制。特定的用户或组可以读取某个对象,而其他用户或组可以写入某个对象。 |
| • | 您最好使用平台的审核功能,而不是在应用程序级别传递标识和执行审核。 |
如果您确实选择了模拟/委派模型(或者由于公司的安全策略而必须这样做),并将原调用方的上下文通过应用程序层传递到后端,则在设计时必须考虑委派和网络访问问题(在跨多台计算机时,这个问题很重要)。共享资源池(如数据库连接)也是一个关键的问题,它可能会显著降低应用程序的伸缩性。
这部分说明如何为两个最常见的应用方案实现模拟/委派:
| • | ASP.NET 到 SQL Server |
| • | ASP.NET 到企业服务到 SQL Server |
有关受信任的子系统模型和模拟/委派模型及其相对优点的详细信息,请参见第 3 章身份验证和授权。
在此方案中,使用原调用方的安全性上下文来调用数据库。这部分描述的身份验证选项包括基本身份验证和集成 Windows 身份验证。ASP.NET 到企业服务到 SQL Server 部分描述了 Kerberos 委派方案。
以下基本身份验证配置设置允许将原调用方一直传递到数据库。
表 5.5: 安全措施
| 类别 | 明细 | ||||||||
身份验证 |
| ||||||||
授权 |
| ||||||||
安全通信 |
|
在此方法中,一定要注意以下几点:
| • | 基本身份验证使用弹出式对话框提示用户,用户可以在该对话框中键入凭据(用户名和密码)。 |
| • | 数据库必须识别原调用方。如果 Web 服务器和数据库位于不同的域中,则必须启用相应的信任关系以允许数据库对原调用方进行身份验证。 |
集成 Windows 身份验证导致 NTLM 或 Kerberos 身份验证,具体情况取决于客户机和服务器计算机的配置。
NTLM 身份验证不支持委派,因此不允许将原调用方的安全性上下文从 Web 服务器传递到物理意义上的远程数据库。在浏览器和 Web 服务器之间使用单个网络跃点以便进行 NTLM 身份验证。要使用 NTLM 身份验证,必须在 Web 服务器上安装 SQL Server,这可能仅适用于很小的 Intranet 应用程序。
在此方案中,ASP.NET 页调用远程企业服务应用程序中驻留的业务组件,而这些组件又连接到某个数据库上。原调用方的安全性上下文从浏览器一直传递到数据库。图 5.9 中显示了这种情况。

图 5.9
ASP.NET 会调用企业服务的一个组件,而该组件将调用数据库
| • | 用户安装了 Internet Explorer 5. x 或更高版本。 |
| • | 所有计算机都运行 Windows 2000 或更高版本。 |
| • | 用户帐户保存在单一目录林的 Active Directory 中。 |
| • | 应用程序将原调用方的安全性上下文(在操作系统级别)一直传递到数据库。 |
| • | 所有层都使用 Windows 身份验证。 |
| • | 将域用户帐户配置为使用委派,而在 Active Directory 中必须将用来运行企业服务应用程序的帐户标记为“可以委派其他帐户”。 |
在此方案中,Web 服务器验证调用方的身份。然后,您必须将 ASP.NET 配置为使用模拟,以便将原调用方的安全性上下文传递到远程企业服务应用程序。在企业服务应用程序中,组件代码必须明确地模拟调用方(使用 CoImpersonateClient),确保将调用方的上下文传递到数据库。
表 5.6: 安全措施
| 类别 | 明细 | ||||||
身份验证 |
| ||||||
授权 |
| ||||||
安全通信 |
|
图 5.10 显示了此方案的建议安全配置。

图 5.10
ASP.NET 会调用企业服务的一个组件,而该组件将调用数据库。原调用方的安全性上下文传递到数据库。
在开始之前,应注意以下配置问题:
| • | 在 Active Directory 中,必须将企业服务进程帐户标记为“可以委派其他帐户”,不得将最终用户帐户标记为“敏感,无法被委派”。有关详细信息,请参见本指南中的如何为 Windows 2000 实现 Kerberos 委派。 |
| • | 要求所有计算机都安装 Windows 2000 或更高版本。这包括客户端(浏览器)计算机和所有服务器。 |
| • | 所有计算机都必须在 Active Directory 中,并且必须属于单个目录林。 |
| • | 承载企业服务的应用程序服务器必须运行 Windows 2000 SP3。 |
| • | 如果您在 Windows 2000 上使用的是 Internet Explorer 6.0,则它默认使用 NTLM 身份验证,而不是所需的 Kerberos 身份验证。要启用 Kerberos 委派,请参见 Microsoft 知识库文章 Q299838 Unable to Negotiate Kerberos Authentication After Upgrading to Internet Explorer 6(升级到 Internet Explorer 6 后,无法协商 Kerberos 身份验证)。 |
| 配置 Web 服务器 (IIS) | |
| 步骤 | 更多信息 |
禁用对 Web 应用程序的虚拟根目录的匿名访问 启用 Windows 集成身份验证 |
|
| 配置 Web 服务器 (ASP.NET) | |
| 步骤 | 更多信息 |
将 ASP.NET Web 应用程序配置为使用 Windows 身份验证 | 编辑 Web 应用程序的虚拟根目录下的 Web.config <authentication mode="Windows" /> |
配置 ASP.NET Web 应用程序的模拟功能 | 编辑 Web 应用程序的虚拟目录下的 Web.config。将 <identity> 元素设置为: <identity impersonate="true" /> |
配置 ASP.NET Web 应用程序传出调用时所使用的 DCOM 模拟级别 | ASP.NET Web 应用程序通过 DCOM 调用远程服务组件。用于 ASP.NET 所发出调用的默认模拟级别是“Impersonate”。在 Machine.config 中必须将它更改为“Delegate”。 编辑 Machine.config,找到 <processModel> 元素,将 comImpersonateLevel 属性设置为“Delegate”(如下所示)。 <processModel comImpersonationLevel="Delegate" |
在客户端配置 DCOM 身份验证级别 | DCOM 身份验证级别是由客户端和服务器共同确定的。在此方案中,DCOM 客户端是 ASP.NET。 编辑 Machine.config,找到 <processModel> 元素,将 comAuthenitcationLevel 属性设置为 PktPrivacy,如下所示。 <processModel comAuthenticationLevel="PktPrivacy" |
| 配置服务组件(和应用程序服务器) | |
| 步骤 | 更多信息 |
托管类必须从 ServicedComponent 类继承 | 请参见 Microsoft 知识库文章 Q306296 HOW TO: Create a Serviced .NET Component in Visual C# .NET(HOW TO:在 Visual C# .NET 中创建 .NET 服务组件)。 |
在服务组件中添加代码以模拟调用方,方法是在访问远程资源(例如,数据库)之前,从 OLE32.DLL 中调用 CoImpersonateClient() 和 CoRevertToSelf() API,以便使用调用方的上下文。默认情况下,企业服务进程上下文用于传出调用。 | 添加对 OLE32.DLL 的引用:
class COMSec
{
[DllImport("OLE32.DLL", CharSet=CharSet.Auto)]
public static extern long CoImpersonateClient();
[DllImport("OLE32.DLL", CharSet=CharSet.Auto)]
public static extern long CoRevertToSelf();
}
在调用远程资源之前,先调用这些外部函数: COMSec.CoImpersonateClient(); COMSec.CoRevertToSelf(); 有关详细信息,请参见第 9 章企业服务安全性。 |
将企业服务应用程序配置为服务器应用程序 | 这可以通过使用“组件服务”工具,或通过位于服务组件程序集中的以下 .NET 属性进行配置。 [assembly: ApplicationActivation(ActivationOption.Server)] |
配置企业服务应用程序以使用数据包保密性身份验证(以便用加密提供安全通信) | 将以下 .NET 属性添加到服务组件程序集。 [assembly: ApplicationAccessControl( Authentication = AuthenticationOption.Privacy)] |
配置企业服务应用程序以获得组件级基于角色的安全性 | 要在进程和组件级别(包括接口和类)配置角色检查,请使用下列属性。 [assembly: ApplicationAccessControl(AccessChecksLevel= AccessChecksLevelOption. ApplicationComponent)] 使用下列属性修饰类: [ComponentAccessControl(true)] 有关配置接口和方法级角色检查的详细信息,请参见第 9 章企业服务安全性中的配置安全性。 |
创建一个用于运行企业服务的自定义帐户,并在 Active Directory 中将它标记为“可以委派其他帐户” | 在 Active Directory 中,企业服务应用程序需要作为带“可以委派其他帐户”标记的域帐户来运行。有关详细信息,请参见本指南中的如何为 Windows 2000 实现 Kerberos 委派。 |
将企业服务配置为以自定义帐户运行 | 这必须使用“组件服务”工具或脚本进行配置。不能使用服务组件程序集中的 .NET 属性。 |
| 配置数据库服务器 (SQL Server) | |
| 步骤 | 更多信息 |
配置 SQL Server 以便进行 Windows 身份验证 |
|
为用户所属的 Windows 组创建 SQL Server 登录。 | 这将授予对 SQL Server 的访问权限。 |
为每个 SQL Server 登录创建新的数据库用户 | 这将授予对指定数据库的访问权限。 |
建立该数据库用户的数据库权限 | 授予最少的权限 |
| • | 传递原调用方安全性上下文的关键是 Kerberos 身份验证(它生成委派级别令牌)。当服务器进程 (IIS) 收到委派级别令牌后,它可以将该令牌传递到在同一台计算机上使用任一帐户运行的任何其他进程,而无需更改它的委派级别。是使用本地帐户还是域帐户运行辅助进程都无关紧要。“重要的是”IIS 的运行方式。如果它不是使用 LocalSystem 运行的,则需要在 Active Directory 中将它所使用的帐户标记为“可以委派其他帐户”。 |
| • | 在此方案中,由于所有用户都使用 Windows 帐户并且使用的是 Internet Explorer 5.x 或更高版本,所以最好使用 IIS 中的集成 Windows 身份验证(带 Kerberos)。集成 Windows 身份验证的优点是从不通过网络发送用户的密码。另外,登录是透明的,因为 Windows 将使用当前交互用户的登录会话。 |
| • | ASP.NET 构造一个 WindowsPrincipal 对象,并将它附加到当前的 Web 请求上下文(HttpContext.User)。如果您需要在 Web 应用程序中执行授权检查,则可以使用下面的代码。
WindowsPrincipal wp = (HttpContext.Current.User as WindowsPrincipal);
if ( wp.IsInRole("Manager") )
{
// 用户被授权执行管理特定功能
}
ASP.NET FileAuthorizationModule 针对原调用方在 ACL 中检查在 IIS 中映射到 Aspnet_isapi.dll 的 ASP.NET 文件类型。对于静态文件类型(例如 .jpg、.gif 和 .htm 文件),IIS 充当网关守卫,它使用原调用方的标识执行访问检查。 |
| • | 通过对 SQL 使用 Windows 身份验证,可以避免将凭据存储在应用程序服务器上的文件中,也可以避免通过网络传递它们。例如,在连接字符串中包含 Trusted_Connection 属性: ConStr="server=YourServer; database=yourdatabase; Trusted_Connection=Yes;" |
| • | 原调用方的上下文将通过所有层进行传递,这使审核变得非常容易。可以使用平台级审核(例如,Windows 和 SQL Server 提供的审核功能)。 |
| • | 如果在 Windows 2000 上使用 Internet Explorer 6.0,则协商的默认身份验证机制是 NTLM(而不是 Kerberos)。有关详细信息,请参见 Microsoft 知识库文章 Q299838 Unable to Negotiate Kerberos Authentication After Upgrading to Internet Explorer 6(升级到 Internet Explorer 6 后,无法协商 Kerberos 身份验证)。 |
| • | 与使用受信任的子系统模型相比,跨层委派用户在性能和应用程序伸缩性方面要做出很大的牺牲。您无法利用数据库连接池的优点,因为数据库连接与原调用方的安全性上下文绑定在一起,因此无法有效地进行池处理。 |
| • | 此方法也依赖于符合应用程序安全需要的 Windows 组粒度。也就是说,必须按正确的粒度级别设置 Windows 组,以便与访问应用程序的用户类别(具有相同的安全权限)匹配。 |
本章介绍如何保护一套常见 Internet 应用程序方案的安全。
有关 Extranet 应用程序方案和 Internet 应用程序方案,请参见第 6 章 Extranet 安全性和第 7 章 Internet 安全性。