这是一个非常好的问题,遗憾的是,在作为 Web 开发人员和设置 IIS 的背景下,许多开发人员并没有就 IIS/ASP.NET 安全性提出足够的问题。就这样吧……
涵盖列出的身份:
IIS_IUSRS:
这类似于旧的 IIS6 IIS_WPG 组。它是一个内置组,其安全配置使得该组的任何成员都可以充当应用程序池身份。
IUSR:
此帐户类似于旧的 IUSR_<MACHINE_NAME> 本地帐户,它是 IIS5 和 IIS6 网站的默认匿名用户(即通过网站属性的目录安全选项卡配置的用户)。
有关IIS_IUSRS 和IUSR 的更多信息,请参阅:
Understanding Built-In User and Group Accounts in IIS 7
DefaultAppPool:
如果应用程序池配置为使用应用程序池标识功能运行,则将动态创建一个名为 IIS AppPool\<pool name> 的“综合”帐户以用作池标识。在这种情况下,将为池的生命周期创建一个名为 IIS AppPool\DefaultAppPool 的合成帐户。如果您删除池,则此帐户将不再存在。对文件和文件夹应用权限时,必须使用IIS AppPool\<pool name> 添加这些权限。您也不会在您的计算机用户管理器中看到这些池帐户。有关详细信息,请参阅以下内容:
Application Pool Identities
ASP.NET v4.0: -
这将是 ASP.NET v4.0 应用程序池的应用程序池标识。请参阅上面的DefaultAppPool。
NETWORK SERVICE: -
NETWORK SERVICE 帐户是 Windows 2003 中引入的内置标识。NETWORK SERVICE 是一个低权限帐户,您可以在该帐户下运行应用程序池和网站。在 Windows 2003 池中运行的网站仍然可以模拟该网站的匿名帐户(IUSR_ 或您配置为匿名身份的任何内容)。
在 Windows 2008 之前的 ASP.NET 中,您可以让 ASP.NET 在应用程序池帐户(通常为 NETWORK SERVICE)下执行请求。或者,您可以将 ASP.NET 配置为通过本地 web.config 文件中的 <identity impersonate="true" /> 设置模拟站点的匿名帐户(如果该设置被锁定,则需要由管理员在 machine.config 文件中完成)。
设置 <identity impersonate="true"> 在使用共享应用程序池的共享主机环境中很常见(与部分信任设置结合使用以防止模拟帐户解除)。
在 IIS7.x/ASP.NET 中,模拟控制现在通过站点的身份验证配置功能进行配置。因此,您可以配置为作为池身份、IUSR 或特定的自定义匿名帐户运行。
LOCAL SERVICE:
LOCAL SERVICE 帐户是服务控制管理器使用的内置帐户。它在本地计算机上具有最低权限集。它的使用范围相当有限:
LocalService Account
LOCAL SYSTEM:
你没有问这个问题,但为了完整起见,我添加了。这是一个本地内置帐户。它拥有相当广泛的特权和信任。切勿将网站或应用程序池配置为在此身份下运行。
LocalSystem Account
实践:
实际上,保护网站的首选方法(如果网站有自己的应用程序池 - 这是 IIS7 的 MMC 中新网站的默认设置)是在Application Pool Identity 下运行。这意味着将站点在其应用程序池的高级设置中的身份设置为Application Pool Identity:
然后您应该在网站中配置身份验证功能:
右键单击并编辑匿名身份验证条目:
确保选择了“应用程序池标识”:
当您应用文件和文件夹权限时,您授予应用程序池身份所需的任何权限。例如,如果您为ASP.NET v4.0 池权限授予应用程序池标识,那么您可以通过资源管理器执行此操作:
单击“检查名称”按钮:
或者您可以使用ICACLS.EXE 实用程序来执行此操作:
icacls c:\wwwroot\mysite /grant "IIS AppPool\ASP.NET v4.0":(CI)(OI)(M)
...或者...如果您站点的应用程序池被称为BobsCatPicBlogthen:
icacls c:\wwwroot\mysite /grant "IIS AppPool\BobsCatPicBlog":(CI)(OI)(M)
我希望这有助于解决问题。
更新:
我刚刚从 2009 年偶然发现了这个出色的答案,其中包含一堆有用的信息,非常值得一读:
The difference between the 'Local System' account and the 'Network Service' account?