使用模拟时,ASP.NET 应用程序可以选择在它们所代表的客户端标识下执行操作。这样做的原因是可以避免在 ASP.NET 应用程序代码中处理身份验证和授权问题。相应的,根据 Internet 信息服务 (IIS) 对用户进行身份验证,然后或者将已通过身份验证的令牌传递到 ASP.NET 应用程序,或者在无法对用户进行身份验证时,传递未经验证的令牌。在上述任何一种情况下,如果启用了模拟,则 ASP.NET 应用程序会模拟所收到的任何令牌。然后,模拟客户端的 ASP.NET 应用程序根据 NTFS 目录和文件的设置使自己获得访问权限或者得不到访问权限。确保将服务器的文件空间格式化为 NTFS 格式,以便设置访问权限。
在默认情况下禁用模拟。考虑到 ASP 的兼容性,用户必须明确地启用模拟。如果为某一给定的应用程序启用了模拟,ASP.NET 总是模拟 IIS 提供给 ISAPI 扩展的访问令牌。该令牌或者是已通过身份验证的用户令牌,或者是匿名用户的令牌(如 IUSR_MACHINENAME)。模拟的发生与应用程序中正在使用的身份验证类型无关。
只有应用程序代码才能被模拟;编译和配置作为进程令牌进行读取。编译的结果放在“Temporary ASP.NET files”目录中。正被模拟的帐户需要有该目录的读/写访问权限。如果应用程序位于通用命名约定 (UNC) 的共享上,ASP.NET 将总是模拟提供给 IIS 的令牌来访问该共享,除非使用了已配置的帐户。如果提供了明确配置的帐户,ASP.NET 将使用该帐户而不使用 IIS UNC 令牌。不希望进行每个请求模拟的应用程序可简单地配置为模拟发出请求的用户。
在默认情况下,在计算机级别禁用模拟,所有的应用程序域会继承该设置(除非该设置被覆盖)。通过将配置文件放置在应用程序根目录下可以启用模拟。有关 ASP.NET 配置系统的详细信息,请参阅 ASP.NET 配置。
和其他配置的指令一样,该指令也是按层次结构进行应用。在层次结构中嵌套的应用程序遵守该指令,除非它被明确地覆盖。下面是此设置的默认值。
<impersonation enable="false"/>
启用应用程序模拟的最小配置文件与下面的示例类似。
<!-- Web.config 文件。 -->
<identity impersonate="true"/>
将应用程序作为可配置标识运行也要有名称支持。例如:
<identity impersonate="true" userName="contoso\Jane" password="pass"/>
这使得整个应用程序作为 contoso\Jane
运行,只要密码正确而与请求的标识无关。这种类型的模拟能够被委派给另一台计算机。
可以通过编程来读取被模拟用户的标识,如下例所示。
[Visual Basic]
Dim username As String = System.Security.Principal.WindowsIdentity.GetCurrent().Name
[C#]
String username = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
在前面的示例中,userName 和 password 以明文形式存储在配置文件中。尽管 IIS 将不会为响应用户代理请求而传输 .config 文件,但是可通过其他方法读取配置文件,例如,通过对包含该服务器的域具有正确凭据的经过身份验证的用户访问。为了维护安全性,标识部分支持在注册表中存储加密的 userName 和 password 属性,如下例所示。
userName="registry:HKLM\Software\AspNetIdentity,Name"
password="registry:HKLM\Software\AspNetIdentity,Password"
关键字 registry 后面、第一个逗号前面的字符串部分表示 ASP.NET 必须要打开的注册表项。逗号后面的部分包含一个字符串值名,ASP.NET 将从中读取凭据。逗号是必需的,凭据必须存储在 HKLM 配置单元中。如果配置格式有误,则 ASP.NET 将不启动工作进程,并随后出现当前帐户创建失败代码的路径。
关键字 registry 后面、逗号前面的字符串部分表示 ASP.NET 所打开的注册表项的名称。逗号后面的部分包含一个字符串值名,ASP.NET 将从中读取凭据。逗号是必需的,凭据必须存储在 HKLM 配置单元中。如果配置格式有误,则 ASP.NET 将不启动工作进程,并随后出现当前帐户创建失败代码的路径。
凭据必须采用 REG_BINARY 格式,其中包含对 Windows API 函数 CryptProtectData 调用的输出结果。您可以用 ASP.NET 设置注册表控制台应用程序 (Aspnet_setreg.exe) 创建加密凭据并将其存储在注册表中,该应用程序使用 CryptProtectData 完成加密。要下载 Aspnet_setreg.exe 以及 Visual C++ 源代码和帮助,请访问网站 www.asp.net 并搜索 aspnet_setreg。
您应该对存储加密凭据的注册表项配置访问权限,以便只对 Administrators 和 SYSTEM 提供访问。因为该注册表项将由作为 SYSTEM 运行的 ASP.NET 进程读取,您应该设置下列权限:
Administrators:F
SYSTEM:F
CREATOR OWNER:F
ProcessAccount:R
这将提供两道防线来保护数据。
ACL 权限要求访问数据的标识为 Administrator。攻击者必须在服务器上运行代码 (CryptUnprotectData) 以便恢复帐户的凭据。