下面是iis7.5和ASP的一个问题。NET,我一直在研究,但毫无进展。任何帮助都将不胜感激。
我的问题是:使用ASP。在IIS 7.5中,IIS和/或操作系统如何允许web应用程序在完全信任下运行时写入像C:\dump这样的文件夹?为什么我不需要显式地为应用程序池用户(在本例中是ApplicationPoolIdentity)添加写访问权限?
我知道这么多:
In IIS 7.5, the default Identity for an Application Pool is ApplicationPoolIdentity.
ApplicationPoolIdentity represents a Windows user account called "IIS APPPOOL\AppPoolName", which is created when the Application Pool is created, where AppPoolName is the name of the Application Pool.
The "IIS APPPOOL\AppPoolName" user is by default a member of the IIS_IUSRS group.
If you are running under Full Trust, your web application can write to many areas of the file system (excluding folders like C:\Users, C:\Windows, etc). For example, your application will have access to write to some folders, like, C:\dump.
By default, the IIS_IUSRS group is not given read or write access to C:\dump (at least not access that is visible through the "Security" tab in Windows Explorer).
If you deny write access to IIS_IUSRS, you will get a SecurityException when trying to write to the folder (as expected).
那么,考虑到所有这些因素,如何将写访问权限授予“IIS appppool \AppPoolName”用户?w3wp.exe进程作为该用户运行,那么是什么允许该用户写入它似乎没有显式访问权限的文件夹呢?
请注意,我理解这样做可能是为了方便,因为如果您在完全信任下运行,那么授予用户对需要写入的每个文件夹的访问权将是一件痛苦的事情。如果希望限制这种访问,可以始终在Medium Trust下运行应用程序。我对操作系统和/或IIS允许这些写入的方式感兴趣,即使似乎没有显式授予文件系统访问权。
右键单击文件夹。
单击“属性”
单击“安全选项卡”。你会看到这样的东西:
点击上方屏幕中的“编辑…”按钮。你会看到这样的东西:
点击上方屏幕中的“添加…”按钮。你会看到这样的东西:
点击屏幕上方的“位置…”按钮。你会看到类似这样的东西。现在,转到这个树结构的最顶端,选择您的计算机名,然后单击OK。
现在输入“iis apppool\your_apppool_name”,然后点击“检查名称”按钮。如果apppoool存在,您将在文本框中看到带有下划线的apppoool名称。单击OK按钮。
勾选/取消勾选您需要授予该帐户的任何访问权限
单击“应用”按钮,然后单击“确定”。
ApplicationPoolIdentity被分配为Users组和IIS_IUSRS组的成员。乍一看,这可能有点令人担忧,但用户组的NTFS权限有些有限。
例如,如果您尝试在C:\Windows文件夹中创建一个文件夹,那么您会发现您不能。ApplicationPoolIdentity仍然需要能够从windows系统文件夹中读取文件(否则工作进程如何能够动态加载必要的DLL)。
关于你对能够写入c:\dump文件夹的观察。如果你在高级安全设置中查看权限,你会看到以下内容:
看到特殊权限继承自c:\:
这就是站点的ApplicationPoolIdentity可以读写该文件夹的原因。这个权限是从c:\ drive继承的。
在共享环境中,您可能有几百个站点,每个站点都有自己的应用程序池和应用程序池标识,您可以将站点文件夹存储在删除了Users组的文件夹或卷中,并且权限设置为只有管理员和SYSTEM帐户具有访问权限(带有继承)。
然后,您将单独分配每个IIS AppPool\[name]在其站点根文件夹上所需的必要权限。
您还应该确保您创建的用于存储潜在敏感文件或数据的任何文件夹都已删除Users组。你还应该确保你安装的任何应用程序都不会将敏感数据存储在它们的c:\program files\[app name]文件夹中,而是使用用户配置文件文件夹。
因此,是的,乍一看,ApplicationPoolIdentity拥有比它应该拥有的更多的权利,但实际上它所拥有的权利并不比它的组成员资格所规定的更多。
可以使用SysInternals Process Explorer工具检查ApplicationPoolIdentity的组成员关系。找到与您感兴趣的应用程序池标识一起运行的工作进程(您必须将User Name列添加到列列表中以显示:
例如,我在这里有一个名为900300的池,它的应用程序池标识为IIS APPPOOL\900300。右键单击进程的属性,然后选择Security选项卡:
我们可以看到IIS APPPOOL\900300是Users组的成员。
右键单击文件夹。
单击“属性”
单击“安全选项卡”。你会看到这样的东西:
点击上方屏幕中的“编辑…”按钮。你会看到这样的东西:
点击上方屏幕中的“添加…”按钮。你会看到这样的东西:
点击屏幕上方的“位置…”按钮。你会看到类似这样的东西。现在,转到这个树结构的最顶端,选择您的计算机名,然后单击OK。
现在输入“iis apppool\your_apppool_name”,然后点击“检查名称”按钮。如果apppoool存在,您将在文本框中看到带有下划线的apppoool名称。单击OK按钮。
勾选/取消勾选您需要授予该帐户的任何访问权限
单击“应用”按钮,然后单击“确定”。