ASP.NET 模拟

更新:2007 年 11 月

使用模拟时,ASP.NET 应用程序可以用发出请求的用户的 Windows 标识(用户帐户)执行。模拟通常用于依赖 Microsoft Internet 信息服务 (IIS) 来对用户进行身份验证的应用程序。

默认情况下禁用 ASP.NET 模拟。如果对某 ASP.NET 应用程序启用了模拟,该应用程序将运行在标识上下文中,其访问标记被 IIS 传递给 ASP.NET。该标记既可以是已通过身份验证的用户标记(如已登录的 Windows 用户的标记),也可以是 IIS 为匿名用户提供的标记(通常为 IUSR_MACHINENAME 标识)。

当启用模拟时,只有应用程序代码运行在被模拟的用户的上下文中。将使用 ASP.NET 进程的标识编译应用程序和加载配置信息。有关更多信息,请参见 配置 ASP.NET 进程标识。编译的应用程序将放在 Temporary ASP.NET files 目录中。所模拟的应用程序标识需要对该目录的读/写访问权限。所模拟的应用程序标识还需要至少对应用程序目录和子目录中的文件的读访问权限。有关更多信息,请参见 ASP.NET 必需的访问控制列表 (ACL)

xh507fc5.alert_note(zh-cn,VS.90).gif说明:

因为当编译应用程序和加载配置信息时,ASP.NET 使用 ASP.NET 进程的 Windows 标识,所以必须让应用程序代码和配置信息对承载多个应用程序的服务器上的其他应用程序保密。在 Windows Server 2003 上,可以创建多个应用程序池,并为每个应用程序池指定唯一的标识。然后,可以使用访问控制列表 (ACL)(如果文件系统是使用 NTFS 格式化的)和这些标识来限制对应用程序文件的访问。例如,请考虑两个应用程序,App1 和 App2,其中每个应用程序中的信息都应保密。可以将 App1 放入 ApplicationPool1 应用程序池中,该池的标识为 ID_ApplicationPool1。可以将 App2 放入 ApplicationPool2 应用程序池中,该池的标识为 ID_ApplicationPool2。ID_ApplicationPool1 帐户可以访问 App1 中的文件,但是不能访问 App2 中的文件。ID_ApplicationPool2 可以访问 App2 中的文件,但是不能访问 App1 中的文件。请注意,在 Windows 2000 或 Windows XP Professional 中不能做出这样的区分,因为在这些操作系统上,所有 ASP.NET 应用程序的进程标识是同一个标识。

可以使用标识配置元素来控制模拟。与其他配置指令的情况相同,此指令分层应用。为应用程序启用模拟的最小配置文件可能看上去和下面的示例类似:

<configuration>
  <system.web>
    <identity impersonate="true"/>
  </system.web>
</configuration>

您还可以添加对特定名称的支持,将应用程序作为可配置的标识运行,如下面的示例所示:

<identity impersonate="true" 
  userName="contoso\Jane" 
  password="********" />

请将以上示例中列出的值替换为正确的密码。

xh507fc5.alert_note(zh-cn,VS.90).gif说明:

在上例中,用户名和密码以明文形式存储在配置文件中。为了改进应用程序的安全性,建议您使用访问控制列表 (ACL) 限制对 Web.config 文件的访问,并且使用受保护的配置对 Web.config 文件中的标识配置元素进行加密。有关更多信息,请参见使用受保护的配置加密配置信息

该示例中阐释的配置使整个应用程序可以使用 contoso\Jane 标识运行,与请求的标识无关。可以将这种类型的模拟委托给另一台计算机。即,如果为模拟的用户指定用户名和密码,则可以连接到网络上的另一台计算机并使用集成安全性请求资源,如文件或对 SQL Server 的访问。如果启用模拟但是不将域帐户指定为标识,则不能连接到网络上的另一台计算机,除非将 IIS 应用程序配置为使用基本身份验证。

xh507fc5.alert_note(zh-cn,VS.90).gif说明:

在 Windows 2000 上,不能使用特定用户凭据对 ASP.NET 辅助进程的标识进行模拟。但是可以在不指定特定用户凭据的情况下启用模拟,以便应用程序模拟由 IIS 确定的标识。有关更多信息,请参见位于 https://support.microsoft.com/default.aspx?ln=zh-cn 上的 Microsoft 知识库文章 810204“PRB: Per Request Impersonation Does Not Work on Windows 2000 with ASP.NET”(PRB:“每次请求”模拟在带 ASP.NET 的 Windows 2000 上不工作)。

读取被模拟标识

下面的代码示例演示如何以编程方式读取被模拟用户的标识:

Dim username As String = _
    System.Security.Principal.WindowsIdentity.GetCurrent().Name
String username = 
    System.Security.Principal.WindowsIdentity.GetCurrent().Name;

请参见

其他资源

ASP.NET Web 应用程序安全性