我们已将现有应用程序放入带有IIS 7.5的新R2服务器。
现在一切正常,应用程序可以写入它的文件夹...但我们想知道如何...新的IIS附带IIS应用程序池身份故事,它为每个应用程序创建一个新的虚拟用户,所以它已经完成了这个。
在文档中声明必须将此用户分配到文件夹才能使一切正常工作......但在我们的情况下,它不是?!它仍然有效,通过该用户的应用程序可以访问吗?
在论坛的某个地方有人提到这是因为在完全信任下运行的应用程序可以在任何地方写任何东西......但这没有意义吗?在我所知道的CAS中没有处理这个问题?
因此,在IIS 7.5下,具有自己的池的应用程序如何具有写入权限,而不是在该文件夹的安全设置下?
弗拉丹
答案 0 :(得分:19)
修改强>:
虽然我觉得我在下面概述的是一个很好的讨论,信任级别如何在ASP.NET中进行文件系统访问,但我觉得原始问题的正确答案已发布here(是的,我必须通过添加更多信息来重新解决这个问题)。基本上,AppPoolIdentity
用户也是Users
组的成员,这就是该用户可以写入文件系统的不同区域的方式。
ORGINAL ANSWER :
在IIS 7.5中创建新的应用程序池时,AppPoolIdentity用户将添加到IIS_IUSRS
组。该组具有“访问所有必要文件和系统资源的权限,以便帐户在添加到该组时可以无缝地充当应用程序池标识”(1)。 IIS_IUSRS
组具有写入绝大多数文件系统的权限(受保护文件夹之外,如C:\,C:\ Users,C:\ Windows等)。不幸的是,我无法找到任何方法明确地看到IIS_IUSRS
组可以使用Windows资源管理器访问给定文件夹(编辑:上面引用的帖子概述了如何“看到”这个访问)。但是,在尝试写入该文件夹(这将导致IIS_IUSRS
)之前,可以通过向文件夹上的System.UnauthorizedAccessException
组授予DENY访问权来隐式地看到此访问权限。
.NET Trust Levels也可以使用权限。在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, 文化=中性, 公钥= b77a5c561934e089' 失败。
尝试以低或最低信任级别写入任何文件时会发生同样的异常。
这与尝试访问AppPoolIdentity用户在完全信任或高信任下运行时无权访问的文件时收到的错误不同。在这种情况下引发的异常是System.UnauthorizedAccessException
,其消息类似于:
System.UnauthorizedAccessException的: 访问路径'C:\ test.txt'是 拒绝。
在中等,低或最小信任级别CAS接管并拒绝访问文件创建方法,无论文件夹权限如何。
简短的说法是,如果要确保您的Web应用程序无法写入除Web应用程序文件夹以外的任何文件夹,则需要将应用程序设置为在Medium trust或更低版本下运行。如果这样做,那么您需要进行测试以确保应用程序不需要执行任何需要大于中等信任的功能。
参考文献:
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