我对两个账户之间的区别感到困惑,
- 应用程序池将在其上运行的 Windows 帐户;
- 当我们使用匿名访问IIS的Web应用程序时相关的映射的Windows帐户。
有什么区别?
我正在使用 Windows Server 2003 x64 + IIS 6.0。
提前致谢,乔治
答案1
这有点令人困惑,不是吗?首先,匿名访问帐户已经存在很久了,应用程序池的概念在 IIS 6 中是新出现的。我认为(尽管我没有证据)如果 IIS 现在从头开始设计,它不应该这样设置,感觉它只是为了保持兼容性。
应用程序池帐户需要服务器上的某些权限。这些权限通常通过将帐户添加到 IIS_WPG 本地组来授予。
匿名访问帐户不需要这些权限。
假设您的网站设置为允许匿名访问,那么您的页面以哪个帐户运行将由 Web 应用程序的模拟设置决定。如果模拟处于打开状态,则请求将作为匿名帐户处理。另一方面,如果模拟被关闭,则请求将作为应用程序池帐户运行,而不管身份验证设置如何。
如果您不需要模拟,那么关闭它,您将获得稍好的吞吐量。我还认为,如果页面请求作为应用程序池运行,而不是让另一个帐户参与该过程,则更容易遵循。
我为企业内部网编写了一些小型 Web 应用程序。这些应用程序往往使用 Windows 身份验证,这样 ASP 就知道谁在访问页面,但不会进行模拟,因此请求将作为应用程序池运行。这允许数据库访问以 Windows 帐户运行,这使得管理更加容易(在我看来)并且让我们的 DBA 感到满意。
一个不需要知道谁在运行它的站点会打开匿名访问但关闭模拟。
编辑:进一步阅读。
快速搜索 MSDN 发现这这篇文章可能会有所帮助。我还发现这些 二有关 IIS 7 中的变化的文章。
它们似乎支持我的理论:现在 IIS 支持应用程序池,匿名访问帐户并不是真正需要的。
编辑:关于模拟,
如果 web.config 中没有设置,ASP.NET 将使用 machine.config 中的设置。有关各种配置文件如何交互的更多信息,请参阅这里
答案2
我是新用户,没有足够的声誉点数来发表评论,所以希望这样回复是可以的。很棒的讨论。我想我会插入几条评论。
pipTheGeek,正如您所指出的,这在 IIS7 中要好得多。您可以将站点设置为始终只使用应用程序池标识。这样您就不再需要维护 2 个用户了。当每个应用程序池有 1 个站点,或者同一应用程序池中的所有站点相互信任时,这非常有用。
IIS_ WPG(不带空格。此文本序列使其变为斜体)是必需的,不是模拟的考虑因素。在 IIS6 中,如果您不将用户添加到 IIS_ WPG 组,则它不能用作应用程序池的标识。应用程序池将在第一次尝试使用它时失败。在 IIS7 中,用户会自动注入 IIS_ WPG,因此您不必再担心它。
在模拟方面,它并非 100% 遵循,因此您始终需要至少对应用程序池标识和匿名或经过身份验证的用户具有读取权限。例如,如果您对 SQL Server 连接字符串使用 Windows 身份验证,它将始终 RevertToSelf 并使用应用程序池标识,而不是匿名(或经过身份验证)用户的身份。
George,要确认您是否设置了模拟,请使用 www.sysinternals.com 上的 processmonitor。通过它,您可以查看磁盘上正在使用的内容,并且行的属性将显示它是否被模拟。这是一个免费工具,在生产服务器上很安全,而且很容易学习。
默认情况下,模拟功能未启用,因此如果您在 web.config 中没有看到它,则可能尚未启用。但是,如果您不是服务器管理员,请检查 framework\config 文件夹中的根 web.config 和 machine.config,以确认它未在此处设置。搜索单词“impersonate”。
另一方面,每当您看到有关 ASPNET 用户的文档时,请将其视为旧的和适用于 IIS5。它在 IIS6,7 中的真正含义是应用程序池身份用户。