这是IIS 7.5和ASP.NET的问题,我一直在研究并无处可去 . 任何帮助将不胜感激 .
我的问题是:在IIS 7.5中使用ASP.NET,IIS和/或操作系统如何在完全信任下运行时允许Web应用程序写入 C:\dump
这样的文件夹?我怎么没有为应用程序池用户显式添加写访问权限(在本例中为 ApplicationPoolIdentity
)?
我知道的很多:
-
在IIS 7.5中,应用程序池的默认标识为
ApplicationPoolIdentity
. -
ApplicationPoolIdentity
表示名为"IIS APPPOOL\AppPoolName"的Windows用户帐户,该帐户在创建应用程序池时创建,其中AppPoolName是应用程序池的名称 . -
"IIS APPPOOL\AppPoolName"用户默认为
IIS_IUSRS
组的成员 . -
如果您在完全信任下运行,您的Web应用程序可以写入文件系统的许多区域(不包括
C:\Users
,C:\Windows
等文件夹) . 例如,您的应用程序将有权写入某些文件夹,例如C:\dump
. -
默认情况下,
IIS_IUSRS
组未获得对C:\dump
的读取或写入访问权限(至少不能通过Windows资源管理器中的"Security"选项卡显示访问权限) . -
如果拒绝对
IIS_IUSRS
的写访问权限,则在尝试写入文件夹时会出现SecurityException(如预期的那样) .
因此,考虑到所有这些,如何授予“IIS APPPOOL \ AppPoolName”用户写入权限? w3wp.exe进程以此用户身份运行,那么是什么允许此用户写入它似乎没有显式访问权限的文件夹?
请注意,我理解这可能是为了方便起见,因为如果您在完全信任下运行,授予用户访问它需要写入的每个文件夹将是一件痛苦的事 . 如果要限制此访问权限,则始终可以在“中等信任”下运行该应用程序 . 我有兴趣了解操作系统和/或IIS允许这些写入的方式,即使似乎没有授予显式文件系统访问权限 .
3 回答
ApplicationPoolIdentity
被分配了Users
组和IIS_IUSRS
组的成员资格 . 乍一看,这可能看起来有些令人担忧,但是Users
组的NTFS权利有限 .例如,如果您尝试在
C:\Windows
文件夹中创建一个文件夹,那么您将'll find that you can' t .ApplicationPoolIdentity
仍然需要能够从Windows系统文件夹中读取文件(否则,工作进程还能够如何动态加载必要的DLL) .关于您对能够写入
c:\dump
文件夹的观察 . 如果您查看高级安全设置中的权限,您将看到以下内容:请参阅从
c:\
继承的特殊权限:'s the reason your site' s
ApplicationPoolIdentity
可以读写该文件夹 . 这项权利继承自c:\
驱动器 .在可能有数百个站点的共享环境中,每个站点都有自己的应用程序池和应用程序池标识,您可以将站点文件夹存储在已删除
Users
组的文件夹或卷中,并将权限设置为仅限管理员和SYSTEM帐户具有访问权限(具有继承权) .然后,您将在其站点根文件夹中单独分配每个
IIS AppPool\[name]
所需的必需权限 .您还应确保在存储可能敏感文件或数据的位置创建的任何文件夹都删除了
Users
组 . 您还应确保您安装的任何应用程序不将敏感数据存储在其c:\program files\[app name]
文件夹中,而是使用用户配置文件文件夹 .所以是的,乍看之下,
ApplicationPoolIdentity
看起来有更多的权利,但它实际上没有权利,而不是它的集团成员资格 .可以使用SysInternals Process Explorer tool检查
ApplicationPoolIdentity
的组成员资格 . 查找使用您感兴趣的应用程序池标识运行的工作进程(您必须将User Name
列添加到要显示的列列表中:例如,我在这里有一个名为
900300
的池,其应用程序池标识为IIS APPPOOL\900300
. 右键单击该进程的属性,然后选择Security选项卡,我们看到:我们可以看到
IIS APPPOOL\900300
是Users
组的成员 .右键单击文件夹 .
单击“属性”
单击“安全”选项卡 . 你会看到这样的东西:
单击上面屏幕中的"Edit..."按钮 . 你会看到这样的东西:
单击上面屏幕中的"Add..."按钮 . 你会看到这样的东西:
单击上面屏幕中的"Locations..."按钮 . 你会看到这样的东西 . 现在,转到此树结构的顶部并选择您的计算机名称,然后单击“确定” .
现在输入"iis apppool\your_apppool_name"并单击"Check Names"按钮 . 如果apppool存在,您将在文本框中看到您的apppool名称,并在其中加下划线 . 单击确定按钮 .
选中/取消选中您需要授予该帐户的任何访问权限
单击“应用”按钮,然后单击“确定” .
IIs中的每个应用程序池都创建自己的安全用户文件夹,默认情况下在c:\ users下具有FULL读/写权限 . 打开“用户”文件夹,查看其中的应用程序池文件夹,右键单击,然后检查其分配的应用程序池虚拟帐户的权限 . 您应该看到已添加的应用程序池帐户已分配给其根目录和子文件夹的读/写访问权限 .
因此,这种类型的文件存储访问是自动完成的,您应该能够在应用程序池用户帐户文件夹中编写您喜欢的任何内容,而无需进行任何更改 . 这就是创建每个应用程序池的虚拟用户帐户的原因 .