编辑:
虽然我觉得下面概述的内容很好地讨论了信任级别如何影响 ASP.NET 中的文件系统访问,但我觉得原始问题的正确答案已发布here(是的,我不得不重新提出这个问题添加了更多信息的问题)。基本上,AppPoolIdentity 用户也是Users 组的成员,这就是该用户可以写入文件系统不同区域的方式。
原始答案:
当您在 IIS 7.5 中创建新的应用程序池时,AppPoolIdentity 用户将添加到 IIS_IUSRS 组。该组“可以访问所有必要的文件和系统资源,以便帐户在添加到该组时可以无缝地充当应用程序池身份”(1)。 IIS_IUSRS 组有权写入绝大多数文件系统(在受保护的文件夹之外,如 C:\、C:\Users、C:\Windows 等)。不幸的是,我无法找到任何方法来明确地看到IIS_IUSRS 组可以使用 Windows 资源管理器访问给定的文件夹(编辑:上面引用的帖子概述了如何“查看”此访问权限) .但是,通过在尝试写入该文件夹之前授予对文件夹上的 IIS_IUSRS 组的 DENY 访问权限(这将导致 System.UnauthorizedAccessException),可以隐式看到此访问权限。
.NET 信任级别也会影响权限。在 IIS 7.5 中,如果 Web 应用程序在完全、高或中等信任下运行,则 IIS AppPoolIdentity 用户有权写入默认情况下应用程序运行的文件夹。在完全信任或高度信任下运行时,默认情况下 IIS AppPoolIdentity 用户可以写入除 C:\、C:\Windows 或 C:\Users 等文件夹之外的任何文件夹(除非授予用户对这些文件夹的特定访问权限)。在中等信任级别,默认情况下 IIS AppPoolIdentity 用户仍然可以写入 Web 应用程序文件夹,但尝试写入任何其他文件夹会导致以下异常:
System.Security.SecurityException:
请求类型的许可
'System.Security.Permissions.FileIOPermission,
mscorlib,版本=4.0.0.0,
文化=中性,
PublicKeyToken=b77a5c561934e089'
失败了。
当尝试以低或最低信任级别写入任何文件时,也会发生同样的异常。
这与您在尝试访问 AppPoolIdentity 用户在完全信任或高度信任下运行时无权访问的文件时收到的错误不同。在这种情况下抛出的异常是System.UnauthorizedAccessException,消息类似于:
System.UnauthorizedAccessException:
访问路径 'C:\test.txt' 是
拒绝。
在中等、低或最低信任级别 CAS 接管并拒绝访问文件创建方法,无论文件夹权限如何。
简短的故事是,如果您想确保您的 Web 应用程序不能写入 Web 应用程序文件夹以外的任何文件夹,您需要将应用程序设置为在中等信任或更低信任下运行。如果您这样做,那么您需要进行测试以确保应用程序需要执行的功能没有需要高于中等信任度的功能。
参考资料:
1 - http://learn.iis.net/page.aspx/140/understanding-built-in-user-and-group-accounts-in-iis-7/
2 - http://technet.microsoft.com/en-us/library/dd163542.aspx