• 请参阅本指南中的“构建安全 asp.net 应用程序介绍”。这部分定义了分布式 web 应用程序身份验证、授权、安全通信的重要性。
• 请参阅本指南中的“asp.net 应用程序安全性模型”。这部分概括阐述在创建分布式 asp.net web 应用程序中使用的结构和技术,并强调身份验证、授权、安全通信适合本结构中的哪些部分。
• 结合下面的章节使用本章,它们阐明了本章中讨论的技术:
• “how to create a custom account to run asp.net”。
• “how to implement kerberos delegation for windows 2000”。
• “how to create a dpapi library”。
• “how to use dpapi (machine store) from asp.net”。
• “how to use dpapi (user store) from asp.net with enterprise services”。
• “how to use role-based security with enterprise services”。
• “how to set up ssl on a web server”。
• “how to use ipsec to provide secure communication between two servers”。
• “how to use ssl to secure communication with sql server 2000”。
本页内容 预备知识 asp.net 到 sql server asp.net 到 enterprise services 到 sql server asp.net 到 web services 到 sql server asp.net 到 remoting 到 sql server 将原调用方传递到数据库 小结
如果同类 intranet 中的所有计算机均运行 microsoft windows 2000 或更高版本的操作系统,并且在域中信任用户使用委派,则可以选择将原调用方的安全性上下文委派到后端。
您还必须考虑安全通信问题。尽管您的应用程序运行在 intranet 环境中,也不能认为在网络中传送的数据是安全的。除了需要保护应用程序服务器和数据库之间传送的数据外,可能还需要保护浏览器和 web 服务器之间传送的数据。
本章使用以下常见的 intranet 方案来阐释主要的身份验证、授权和安全通信技术:
• asp.net 到 sql server
• asp.net 到 enterprise services 到 sql server
• asp.net 到 web services到sql server
• asp.net到remoting到sql server
此外,本章还介绍了一个 windows 2000 委派方案(“将原调用方传递到数据库”)。在此方案中,使用中间 web 服务器和应用程序服务器,在操作系统级别将原调用方的安全性上下文和标识从浏览器传递到数据库。
注本章中描述的几个方案或者替换用于运行 asp.net 应用程序的默认 aspnet 帐户,或者更改其密码以允许在远程计算机上创建重复的帐户。这些方案要求更新 machine.config 中的 <processmodel> 元素。<processmodel> 凭据不应该以明文形式存储在 machine.config 中。而应该使用 aspnet_setreg.exe 工具以加密凭据的形式存储在注册表中。有关详细信息请参见本指南中的“asp.net安全性”和 microsoft 知识库文章 q329290 “howto: use the asp.net utility to encrypt credentials and session state connection strings”(如何做:使用 asp.net 工具加密凭证和会话状态链接字符串)。
asp.net 到 sql server 在此方案中,人力资源数据库在同类 intranet 中安全地提供每个用户的数据。应用程序使用受信任的子系统模型并代表原调用方执行调用。应用程序使用集成 windows 身份验证来验证调用方的身份,并使用 asp.net 进程标识来调用数据库。由于数据本身所具有的机密性,因此,在 web 服务器和客户端之间使用了 ssl。
保护方案 在此方案中,web 服务器验证调用方的身份,并通过使用调用方的标识限制对本地资源的访问。要限制原调用方对资源的访问,您不必在 web 应用程序中进行模拟。数据库验证 asp.net 默认进程标识(它是权限最少的帐户)的身份(即数据库信任 asp.net 应用程序)。
表 1:安全措施 类别 详细信息 身份验证 通过在 iis 中使用集成 windows 身份验证,在 web 服务器上提供增强身份验证来验证原调用方的身份。 在 asp.net 内使用 windows 身份验证(不模拟)。 通过将 sql server 配置为使用 windows 身份验证,确保数据库连接的安全。 数据库信任 asp.net 辅助进程以进行调用。可以在数据库中验证 asp.net 进程标识的身份。
授权 使用绑定到原调用方的 acl 在 web 服务器上配置资源。为了简化管理,将用户添加到 windows 组中并在 acl 中使用组。 web 应用程序对原调用方执行 .net 角色检查,以限制对页面的访问。
安全通信 保护在 web 服务器和数据库之间传送的机密数据 保护在原调用方和 web 应用程序之间传送的机密数据
结果 图 2 显示了此方案的建议安全配置。
图 2. asp.net 到 sql server intranet 方案的建议安全配置
安全配置步骤 在开始之前,您需要查看以下内容:
• 创建自定义 asp.net 帐户(请参见本指南中的“how to create a custom account to run asp.net”)
• 创建一个权限最少的数据库帐户(请参见本指南中的“数据访问安全性”)
• 在 web 服务器上配置 ssl(请参见本指南中的“how to set up ssl on a web server”)
• 配置 ipsec(请参见本指南中的“how to use ipsec to provide secure communication between two servers”)
配置 iis 步骤 更多信息 禁用对 web 应用程序的虚拟根目录的匿名访问 启用集成的 windows 身份验证 要使用 iis 身份验证设置,请使用 iis mmc 管理单元。右击应用程序的虚拟目录,然后单击“属性”。 单击“目录安全性”选项卡,然后单击“匿名访问和验证控件”组中的“编辑”。
配置 asp.net 步骤 更多信息 将 aspnet 密码更改为一个已知的强密码值 aspnet 是权限最少的本地帐户,默认情况下用来运行 asp.net web 应用程序。 通过使用“本地用户和组”将 aspnet 帐户的密码设置为一个已知值。 编辑位于 %windir%/microsoft.net/framework/ v1.0.3705/config 中的 machine.config 并重新配置 <processmodel> 元素的 username 和 password 属性
配置 sql server 步骤 更多信息 在 sql server 计算机上创建一个与 asp.net 进程帐户 (aspnet) 匹配的 windows 帐户 用户名和密码必须与 aspnet 帐户匹配。
给予该帐户以下权限: - 从网络访问此计算机 - 拒绝本地登录 - 以批处理作业登录
配置 sql server 以便进行 windows 身份验证
为本地 aspnet 帐户创建一个 sql server 登录 这将授予对 sql server 的访问权限
创建一个新数据库用户,并将登录名映射到数据库用户 这将授予对指定数据库的访问权限
创建一个新的用户定义的数据库角色,并将数据库用户添加到该角色
建立该数据库角色的数据库权限 授予最少的权限 有关详细信息,请参见本指南中的“数据访问安全性”。
配置安全通信 步骤 更多信息 配置 web 站点的 ssl 请参见本指南中的“how to set up ssl on a web server”。
配置 web 服务器和数据库服务器之间的 ipsec 请参见本指南中的“how to use ipsec to provide secure communication between two servers”。
分析 • 在此方案中,由于所有用户都使用 windows 帐户并且使用的是 microsoft internet explorer,所以在 iis 中最好使用集成 windows 身份验证。集成 windows 身份验证的优点是从不通过网络传送用户的密码。此外,由于 windows 使用当前交互式用户的登录会话,所以对于用户来说登录是透明的。
• asp.net 作为权限最少的帐户运行,所以,一旦遭到攻击,潜在危害被大大降低。
• 要执行 .net 角色检查或在 windows acl 中针对原调用方保证资源的安全,您不必在 asp.net 中进行模拟。为了对原调用方执行 .net 角色检查,按如下所示从 http 上下文中检索代表原调用方的 windowsprincipal 对象:
windowsprincipal wp = (httpcontext.current.user as windowsprincipal); if ( wp.isinrole("manager") ) { // user is authorized to perform manager-specific functionality }
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 应用程序角色有关的密码管理和连接池问题。
问与答 • 为什么我不能启用 web 应用程序模拟,以便使用配置的 acl 针对原调用方来保护 web 应用程序所访问的资源?
如果启用模拟,则模拟的安全性上下文不具有网络凭据(假定未启用委派并且您使用的是集成 windows 身份验证)。因此,对 sql server 的远程调用将使用 null 会话,而这将会导致调用失败。如果禁用模拟,则远程请求使用 asp.net 进程标识。
上述方案使用 asp.net fileauthorizationmodule,它使用 windows acl 针对原调用方标识执行授权,并且不要求进行模拟。
如果您使用基本身份验证而不是集成 windows 身份验证 (ntlm),并且确实启用了模拟,则每个数据库调用都将使用原调用方的安全性上下文。每个用户帐户(或用户所属的 windows 组)都要求使用 sql server 登录。需要限制 windows 组(或原调用方)访问数据库对象的权限以确保安全性。
• 数据库不知道谁是原始调用方。我如何能创建一条审核记录?
审核 web 应用程序中的最终用户活动,或者将用户标识作为数据访问调用的参数明确地进行传递。
相关方案 非 internet explorer 浏览器
对 iis 执行集成 windows 身份验证需要使用 internet explorer。在混合浏览器环境中,您的典型选项包括:
有关使用 sql server 作为凭据存储和将密码存储在数据库中的详细信息,请参见本指南中的“数据访问安全性”。
注意,在所有情况中,如果您没有使用集成 windows 身份验证(其中,由平台为您管理凭据),则最后将使用 ssl。不过,此优点仅限于身份验证过程。如果您通过网络传递安全机密数据,则仍须使用 ipsec 或 ssl。
对数据库的 sql 身份验证 在有些方案中,您可能必须使数据访问安全性而不是首选的 windows 身份验证。例如,在 web 应用程序和数据库之间可能设置了防火墙,或者由于安全原因,web 服务器可能不属于您所在的域。这也会妨碍 windows 身份验证。这种情况下,您可以在数据库和 web 服务器之间使用 sql 身份验证。为保证此方案的安全,您应该:
• 使用数据保护 api (dpapi) 来保护包含用户名和密码的数据库连接字符串。有关详细信息,请参阅以下内容:
• 请参见本指南中的“数据访问安全性”中的“安全存储数据库连接字符串”。
• "how to use dpapi (machine store) from asp.net"
• "how to use dpapi (user store) from asp.net with enterprise services"
• "how to create a dpapi library"
• 在 web 服务器和数据库服务器之间,使用 ipsec 或 ssl 来保护通过网络传递的明文凭据。
将原调用方传递到数据库 在此方案中,使用原调用方的安全性上下文从 web 应用程序调用数据库。使用此方法时,一定要注意以下几点:
• 对 sql 的 windows 身份验证意味着,可以避免在文件中存储凭据并通过网络进行传送。
• 当设置了防火墙时(此时 windows 身份验证所需的端口可能没有打开),仍然可以使用本地帐户运行 enterprise services 应用程序,以及在数据库服务器上使用重复的帐户。在此方案中可能无法使用 windows 身份验证和域帐户。
缺陷 • 在数据库服务器上使用重复的 windows 帐户(与 enterprise services 进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。
• 由于基于 .net 角色的安全性以 windows 组成员身份为基础,此解决方案依赖于以正确的粒度设置 windows 组,以便与访问应用程序的用户类别(共享相同的安全权限)匹配。
asp.net 到 web services 到 sql server 在此方案中,运行 asp.net 页的 web 服务器连接到远程服务器上的 web 服务。该服务器又连接到远程数据库服务器。例如,请看一个提供用户特定机密数据的人力资源 web 应用程序。此应用程序依赖 web 服务进行数据检索。图 5 显示了此应用程序方案的基本模型。
图 5. asp.net到远程 web 服务到 sql server
web 服务公开一个允许个别雇员检索他或她的个人详细信息的方法。必须使用 web 应用程序只给通过身份验证的个人提供详细信息。 web 服务还提供了一个支持任何雇员详细信息检索的方法。只有人力资源或工资部门的成员可以使用此功能。在此方案中,将雇员分为三个 windows 组:
保护方案 在此方案中,驻留 asp.net web 应用程序的 web 服务器验证原调用方的标识,并将它们的安全性上下文传递到驻留 web 服务的远程服务器。这样就可以对 web 方法应用授权检查,以允许或拒绝对原调用方的访问。数据库验证 web 服务进程标识的身份(数据库信任 web 服务)。web 服务反过来调用数据库,并使用存储过程参数在应用程序级别传递用户的标识。
表 3:安全措施 类别 详细信息 身份验证 web 应用程序在 iis 中使用集成 windows 身份验证来验证用户的身份。 web 服务在 iis 中使用集成 windows 身份验证。它对 web 应用程序所委派的原调用方安全性上下文进行身份验证。 可以使用 kerberos 身份验证协议,通过委派将原调用方安全性上下文从 web 应用程序传递到 web 服务。 可以使用 windows 身份验证,通过 asp.net 进程帐户连接到数据库。
授权 web 应用程序对原调用方执行角色检查,以限制对页面的访问。 通过使用基于原调用方 windows 组成员身份的 .net 角色,控制对 web 服务方法的访问。
安全通信 可通过使用 ssl 来保护在原调用方和 web 应用程序及 web 服务之间传送的机密数据。 可通过使用 ipsec 来保护在 web 服务和数据库之间传送的机密数据。
结果 图 6 显示了此方案的建议安全配置。
图 6. asp.net 到 web 服务到 sql server 的 intranet 方案的建议安全配置
安全配置步骤 在开始之前,您需要查看以下内容:
• 在 web 服务器上配置 ssl(请参见本指南中的“how to set up ssl on a web server”)
• 配置 ipsec (请参见本指南中的“how to use ipsec to provide secure communication between two servers”)
配置 web 服务器(它驻留 web 应用程序) 配置 iis 步骤 更多信息
禁用对 web 应用程序的虚拟根目录的匿名访问
对 web 应用程序的虚拟根目录启用 windows 集成身份验证
配置 asp.net
步骤 更多信息
将 asp.net web 应用程序配置为使用 windows 身份验证 编辑 web 应用程序的虚拟目录下的 web.config 将 <authentication> 元素设置为:
配置 asp.net web 应用程序的模拟 编辑 web 应用程序的虚拟目录下的 web.config 将 <identity> 元素设置为:
配置 sql server 步骤 更多信息 计算机上创建一个 windows 帐户,以便匹配用于运行 web 服务的 asp.net 进程帐户 用户名和密码必须匹配自定义 asp.net 帐户。
给予该帐户以下权限: - 从网络访问此计算机 - 拒绝本地登录 - 以批处理作业登录
配置 sql server 以便进行 windows 身份验证
为自定义 asp.net 帐户创建一个 sql server 登录 这将授予对 sql server 的访问权限。
创建一个新数据库用户,并将登录名映射到数据库用户 这将授予对特定数据库的访问权限。
创建一个新的数据库用户角色,并将数据库用户添加给该角色
建立数据库用户角色的数据库权限 授予最少的权限
配置安全通信 步骤 更多信息 在 web 服务器上配置 web 站点的 ssl 请参见本指南中的“how to set up ssl on a web server”。
配置 web 服务器和数据库服务器之间的 ipsec 请参见本指南中的“how to use ipsec to provide secure communication between two servers”。
分析 • 在此方案中,iis 中的集成 windows 身份验证是理想的选择。这是因为,所有用户都使用 windows 2000 或更高版本、internet explorer 5.x 或更高版本,并且都使用 active directory 帐户,因此具备了使用 kerberos 身份验证协议(其支持委派)的条件。t这样,您就可以跨计算机边界传递用户的安全性上下文。
• 在 active directory 中,不能将最终用户帐户标记为“敏感,不能被委派”。在 active directory 中,必须将 web 服务器计算机帐户标记为“可以委派其他帐户”。有关详细信息,请参见本指南中的“how to implement kerberos delegation for windows 2000”。
• web 服务器和应用程序服务器上的 asp.net 作为权限最少的本地帐户(本地 aspnet 帐户)运行,这样一旦遭到攻击,潜在危害被大大降低。
• 将 web 服务和 web 应用程序配置为使用 windows 身份验证。将两台计算机上的 iis 配置为使用集成 windows 身份验证。
• 当从 web 应用程序调用 web 服务时,默认情况下不传递凭据。要响应下游 web 服务器上 iis 发出的网络身份验证质询,必须使用凭据。必须使用以下方法设置 web 服务代理的 credentials 属性以明确地指定这一点:
• 将 web 应用程序配置为使用模拟。因此,在从 web 应用程序调用 web 服务时,就会传递原调用方的安全性上下文,并且允许 web 服务对原调用方进行身份验证(和授权)。
• 在 web 服务中使用 .net 角色,基于用户所属的 windows 组(hrdept、payrolldept 和 employees)对用户进行授权。 hrdept 和 payrolldept 的成员可以检索任何雇员的雇员详细信息,而 employees 组的成员仅有权检索他们自己的详细信息。
可以使用 principalpermissionattribute 类在 web 方法中加上注释,以查询特定的角色成员身份,如以下代码示例所示。注意,可以用 b>principalpermission 代替 principalpermissionattribute。这是所有 .net 属性类型的共同特性。
[webmethod] [principalpermission(securityaction.demand, [email protected]"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 进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。
另一种方法是,考虑使用权限最少的域帐户。有关选择 asp.net 进程标识的详细信息,请参见本指南中的“asp.net 安全性”。
• 因为基于 .net 角色的安全性以 windows 组成员为基础,所以此解决方案需要根据相应层次的 windows 组来匹配那些将要访问该应用程序的用户类别(共享相同的安全权限)。
• kerberos 委派是不受限制的,因此必须严格控制在 web 服务器上运行的应用程序标识。为了提高安全门槛,应从 domain users 组中删除域帐户以限制域帐户的访问范围,并且只从相应的计算机提供访问。有关详细信息,请参见 microsoft web 网站 http://www.microsoft.com/windows2000/techinfo/planning/security/secdefs.asp 上的“default access control settings”(默认访问控制设置)白皮书。
问与答 数据库不知道谁是原始调用方。我如何能创建一条审核记录?
审核 web 服务中的最终用户活动,或者将用户的标识作为数据访问调用的参数明确地进行传递。
相关方案
如果您需要连接到非 sql server 数据库,或者目前使用的是 sql 身份验证,则必须使用连接字符串明确地传递数据库帐户凭据。如果您这样做,请确保安全地存储连接字符串。
有关详细信息,请参见本指南中的“数据访问安全性”中的“安全存储连接字符串”。
asp.net 到 remoting 到 sql server 在此方案中,运行 asp.net 页的 web 地连接到远程应用程序服务器上的远程组件。web 服务器通过使用 .net remoting 在 http 通道上与该组件进行通信。远程组件由 asp.net 驻留。图 7 显示了此方案。
图 7. asp.net 到 remoting using .net remoting 到 sql server
特点 • 用户使用不同类型的 web 浏览器。
• 远程组件由 asp.net 驻留。
• web 应用程序使用 http 通道与远程组件进行通信。
• asp.net 应用程序调用 .net 远程组件,并传递原调用方的凭据以进行身份验证。基本身份验证提供了这些功能。
• 由于数据本身所具有的机密性,必须在进程与计算机之间保证数据的安全。
保护方案 在此方案中,驻留 asp.net web 应用程序的 web 服务器验证原调用方的身份。web 应用程序可以从 http 服务器变量中检索调用方的身份验证凭据(用户名和密码)。然后,web 应用程序通过配置远程组件代理,使用这些凭据连接到驻留远程组件的应用程序服务器。数据库使用 windows 身份验证来验证 asp.net 进程标识的身份(即,数据库信任远程组件)。远程组件反过来调用数据库,并使用存储过程参数在应用程序级别传递原调用方的标识。
表 4:安全措施 类别 详细信息 身份验证 在 iis 中使用基本身份验证对用户进行身份验证(除 ssl 外)。 在远程组件 (asp.net /iis) 中使用 windows 身份验证。 使用权限最少的 asp.net 帐户,通过 windows 身份验证连接到数据库。
授权 在 web 服务器上对原调用方执行 acl 检查。 在远程组件中对原调用方执行角色检查。 授予 asp.net(远程组件)标识访问数据库的权限。
安全通信 使用 ssl 保护在用户和 iis 中驻留的 web 应用程序及远程对象之间传送的机密数据。 使用 ipsec 保护在 web 服务器和数据库之间传送的机密数据。
结果 图 8 显示了此方案的建议安全配置。
图 8. asp.net 到远程 web 服务到 sql server 的 intranet 方案的建议安全配置
安全配置步骤 在开始之前,您需要查看以下内容:
• 创建一个权限最少的数据库帐户(请参见本指南中的“数据访问安全性”)
• 在 web 服务器上配置 ssl(请参见本指南本指南中的“how to set up ssl on a web server”)
• 配置 ipsec(请参见本指南中的“how to use ipsec to provide secure communication between two servers”)
配置 web 服务器 配置 iis 步骤 更多信息
禁用对 web 应用程序的虚拟根目录的匿名访问
启用基本身份验证 使用 ssl 保护基本身份验证凭据。
配置 asp.net
步骤 更多信息
将 asp.net web 应用程序配置为使用 windows 身份验证 编辑应用程序的虚拟根目录下的 web.config 将 <authentication> 元素设置为:
配置应用程序服务器
配置 iis 步骤 更多信息 禁用对 web 应用程序的虚拟根目录的匿名访问
启用集成 windows 身份验证
配置 asp.net
步骤 更多信息
将远程组件(在 asp.net 中)配置为使用 windows 身份验证 编辑远程组件的虚拟根目录下的 web.config 将<authentication> 元素设置为:
将 aspnet 密码更改为一个已知值 aspnet 是权限最少的本地帐户,默认情况下用来运行 asp.net web 应用程序(此处用于运行远程组件主机进程)。 通过使用本地用户和组将 aspnet 帐户的密码改为一个已知值。 编辑位于 %windir%/microsoft.net/framework/ v1.0.3705/config 中的 machine.config
• 对 sql server 进行的 windows 身份验证意味着不必在应用程序服务器上存储凭据,也意味着不必通过网络将凭据发送到 sql server 计算机。
缺陷 • 在数据库服务器上使用重复的 windows 帐户(与 asp.net 进程帐户匹配的帐户)会导致增大管理负担。密码应当定期手动更新并同步。
• 因为基于 .net 角色的安全性以 windows 组成员为基础,所以此解决方案需要根据相应层次的 windows 组来匹配那些将要访问该应用程序的用户类别(共享相同的安全权限)。
相关方案
web 服务器使用 kerberos 来验证调用方的身份。使用 kerberos 委派将原调用方的安全性上下文传递到应用程序服务器上的远程组件。
此方法要求将所有用户帐户配置为使用委派。还将 web 应用程序配置为使用模拟,并且 web 应用程序使用 defaultcredentials 来配置远程组件代理。本指南中的“.net remoting安全性”中的“传送原调用方”部分深入讨论了这种技术。
将原调用方传递到数据库 前面讨论的方案使用了受信任的子系统模型,并且在所有情况下,数据库都信任应用程序服务器或 web 服务器以便正确地对用户进行身份验证和授权。虽然受信任的子系统模型具有许多优点,但是某些方案(多半是出于审核原因)可能要求您使用模拟/委派模型,并且跨计算机边界将原调用方的安全性上下文一直传递到数据库。
• 在 active directory 中,必须将 enterprise services 进程帐户标记为“可以委派其他帐户”,不能将最终用户帐户标记为“敏感,不能委派”。有关详细信息,请参见本指南中的“how to: implement kerberos delegation for windows 2000”。
• 所有计算机都要求安装 windows 2000 或更高版本。这包括客户端(浏览器)计算机和所有服务器。
• 所有计算机都必须在 active directory 中,并且必须属于单个目录林。
• 驻留 enterprise services 的应用程序服务器必须运行 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> 元素设置为:
配置 asp.net web 应用程序的模拟 编辑 web 应用程序的虚拟目录下的 web.config 将 <identity> 元素设置为:
配置 asp.net web 应用程序用于传出调用的 dcom 模拟级别 asp.net web 应用程序通过 dcom 调用远程服务组件。用于 asp.net 所发出调用的默认模拟级别是“impersonate”。在 machine.config 中必须将它更改为“delegate”。
class comsec { [dllimport("ole32.dll", charset=charset.auto)] public static extern long coimpersonateclient(); [dllimport("ole32.dll", charset=charset.auto)] public static extern long coreverttoself(); }
[assembly: applicationaccesscontrol(accesscheckslevel= accesschecksleveloption. applicationcomponent)] decorate classes with the following attribute: [componentaccesscontrol(true)]
创建一个用于运行 enterprise services 的自定义帐户,并在 active directory 中将它标记为“可以委派其他帐户” 在 active directory 中,需要使用标记为“可以委派其他帐户”的域帐户运行 enterprise services 应用程序。有关详细信息,请参见本指南中的“how to implement kerberos delegation for windows 2000”。
如果 iis 是使用 localsystem 帐户运行的,则必须将计算机帐户标记为“可以委派其他帐户”。有关详细信息,请参见本指南中的“how to implement kerberos delegation for windows 2000”。
• 在此方案中,由于所有用户都使用 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") ) { // user is authorized to perform manager-specific functionality }
asp.net fileauthorizationmodule 针对原调用方在 acl 中检查在 iis 中映射到 aspnet_isapi.dll 的 asp.net 文件类型。对于静态文件类型(例如 .jpg、.gif 和 .htm 文件),iis 充当关守,它使用原调用方的标识执行访问检查。
• 过对 sql 使用 windows 身份验证,可以避免在应用程序服务器的文件中存储凭据,也可以避免通过网络传递它们。例如,在连接字符串中包含 trusted_connection 属性:
• 经过所有层传递原调用方的上下文,这使审核变得非常容易。可以使用平台级审核(例如,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 身份验证)。