我们最近升级到IIS7作为核心Web服务器,我需要在权限方面进行概述.以前,当需要写入文件系统时,我会给AppPool用户(网络服务)访问目录或文件.
在IIS7中,我看到,默认情况下,AppPool用户设置为ApplicationPoolIdentity.因此,当我检查任务管理器时,我看到一个名为"WebSite.com"的用户帐户正在运行IIS进程('Website.com'是IIS中网站的名称)
但是,如果我尝试使用该帐户授予权限,则此用户帐户不存在.那么,我如何确定哪个用户也可以授予权限呢?
编辑================================================= =============================
有关屏幕截图中的问题,请参阅下文.我们的网站(www.silverchip.co.uk)使用用户名SilverChip.co.uk运行.但是当我添加提交时,这个用户确实存在!

=================================请参阅AppPool图像

(这是一个关于模糊问题的问题.我试图提供所有相关数据,希望有人提供有用的信息;为长篇描述道歉.)
我们的网络应用
我们有一个在IIS 7.5中运行的.NET 4 Web应用程序,可以访问Active Directory和SQL Server数据库.
此Web应用程序在一个虚拟的"应用程序池标识"运行,通过设置应用程序的应用程序池的标识ApplicationPoolIdentity.可以在StackOverflow答案和它所引用的博客文章中找到虚拟身份的简明描述:应用程序池标识只是一个附加组,它被添加到作为"网络服务"运行的Web应用程序的工作进程中.但是,一位消息人士模糊地暗示"网络服务和ApplicationPoolIdentity确实存在IIS.net站点文档不发布的差异".因此,虚拟身份可能不仅仅是一个额外的群体.
我们选择使用ApplicationPoolIdentity而不是NetworkService,因为它成为IIS 7.5中的默认设置(参见,例如,此处),并且根据Microsoft的建议:"此身份允许管理员指定仅与应用程序所属身份相关的权限池正在运行,从而提高了服务器的安全性." (来自processModel元素,用于为applicationPools添加[IIS 7设置架构])"应用程序池标识是一个强大的新隔离功能","使运行的IIS应用程序更安全可靠."(来自IIS.net文章"应用程序池标识")
该应用程序使用集成Windows身份验证,但<identity impersonate="false"/>不是最终用户的身份,而是使用虚拟应用程序池标识来运行我们的代码.
此应用程序使用System.DirectoryServices类(即ADSI API)查询Active Directory .在大多数地方,这是在不指定其他用户名/密码或其他凭据的情况下完成的.
此应用程序还使用Integrated Security=true连接字符串连接到SQL Server数据库.如果数据库是本地的,那么我们看到IIS APPPOOL\OurAppPoolName用于连接数据库; 如果数据库是远程的,则使用计算机帐户OURDOMAIN\ourwebserver$.
我们的问题
我们经常遇到以下一种方式导致工作安装失败的问题.
当数据库位于远程系统上时,数据库连接开始失败:"用户登录失败'NT AUTHORITY\ANONYMOUS LOGON'.原因:基于令牌的服务器访问验证因基础结构错误而失败.检查以前的错误." 先前的错误是"错误:18456,严重性:14,状态:11." 所以似乎现在OURDOMAIN\ourwebserver$不再使用,而是尝试匿名访问.(我们有轶事证据表明UAC关闭时出现了这个问题,并且在打开UAC后它就消失了.但请注意,更改UAC需要重新启动......)IIS.net线程中报告了类似的问题"使用ApplicationPoolIdentity连接到SQL",特别是在一个回复中.
通过ADSI(System.DirectoryServices)的Active Directory操作开始失败,错误0x8000500C("未知错误"),0x80072020("发生操作错误.")或0x200B("指定的目录服务属性或值不存在") .
从Internet Explorer登录应用程序开始失败,出现HTTP 401错误.但是如果在IIS中我们然后在谈判之前放置NTLM然后再次工作.(请注意,Kerberos需要访问AD,但NTLM不需要访问AD.)IIS.net线程"使用AppPool标识失败的窗口身份验证"中报告了类似的问题.
我们的假设和解决方法
将应用程序池从ApplicationPoolIdentity切换到NetworkService时,至少AD和登录问题似乎总是消失.(我们发现有一份报告证实了这一点.)
页面"解决ASP页面上的身份验证问题"有一些与主要和次要令牌相关的建议,我发现它令人鼓舞的是它链接了我们的前两个错误:它提到了NT AUTHORITY\ANONYMOUS LOGON访问,AD错误0x8000500C和"指定的目录服务属性或值不存在". …
asp.net adsi active-directory iis-7.5 applicationpoolidentity
将我的网站部署到IIS7.5后,我发现了一个奇怪的行为:ApplicationPoolIdentity默认情况下保留应用程序池标识(如IIS应用程序池标识中所推荐),Ninject似乎被忽略,因为我得到以下错误,同时创建了第一控制器:
System.InvalidOperationException:尝试创建类型为"..MainController"的控制器时发生错误.确保控制器具有无参数的公共构造函数.---> System.DirectoryServices.DirectoryServicesCOMException:发生操作错误.
我试图授予FullAccess到IIS AppPool\<MySiteAppPool>文件夹,包含该网站(包括所有子文件夹和文件),但这并没有改变任何东西.
但是,当我将应用程序池标识设置为任何域帐户(即使是简单的帐户,没有管理权限,以及没有任何访问该站点的文件夹)时,它仍然可以正常工作.
根据通过NuGet包设置MVC3应用程序教程来安装Ninject .
我不确定,如果它是相关的,该站点应该在具有Windows身份验证的域Intranet中工作.
因此,唯一的问题似乎是应用程序池标识.至于我渴望使用推荐的方式,我很乐意拥有ApplicationPoolIdentity,而不是域帐户.
这有什么用?是否可以将所有这些混合在一起?
这是一个具有类似问题的SO线程:ASP.NET MVC 4 + Ninject MVC 3 =没有为此对象定义的无参数构造函数.但是根本没有合适的答案.
作为删除的评论建议,我尝试使用NetworkSerive身份.它运作正常.但是,我想这并不比非特权域帐户好多少.
编辑
突然发现另一个依赖:应用程序池标识用于sql server上的Windows身份验证,但我希望在那里使用客户端用户的凭据.
根据评论
同意通过模拟可以使用经过身份验证的凭据访问远程SQL Server.
但是,仍然不清楚ApplicationPoolIdentity和Ninject的问题是什么.
在这个问题的最顶部提到的文章让我想到这可能是因为虚拟帐户没有用户配置文件.这个方面对我来说仍然不清楚,因为仍然可以使IIS能够使用该LoadUserProfile属性加载用户配置文件.如果虚拟帐户没有配置文件,我无法获取,IIS将加载什么?
有人说:
IIS不会加载Windows用户配置文件,但某些应用程序可能会利用它来存储临时数据.SQL Express是执行此操作的应用程序的示例.但是,必须创建用户配置文件以将临时数据存储在配置文件目录或注册表配置单元中.NETWORKSERVICE帐户的用户配置文件由系统创建,始终可用.但是,通过切换到唯一的应用程序池标识,系统不会创建任何用户配置文件.只有标准应用程序池(DefaultAppPool和Classic .NET AppPool)在磁盘上具有用户配置文件.如果管理员创建新的应用程序池,则不会创建用户配置文件.
但是,如果需要,可以通过将"LoadUserProfile"属性设置为"true"来配置IIS应用程序池以加载用户配置文件.
我在serverfault.com上找到了以下主题:
在那里还指出,应用程序池标识不能用作网络服务,特别是查询AD.