如何正确设置IIS 7应用程序池的身份?(How to set up IIS 7 applicati

2019-08-18 02:16发布

已经部署了我的网站IIS7.5我发现一个奇怪的现象:当应用程序池标识是留给有ApplicationPoolIdentity默认情况下(如在推荐的IIS应用程序池标识 ), Ninject似乎被忽略,因为我得到了下面的错误,同时创造最先控制器:

System.InvalidOperationException:试图创建类型的控制装置时发生错误“..MainController”。 确保控制器具有一个无参数的公共构造函数。 ---> System.DirectoryServices.DirectoryServicesCOMException:出现操作错误。

我试图授予FullAccessIIS AppPool\<MySiteAppPool>文件夹,包含该网站(包括所有子文件夹和文件),但这并没有改变任何东西。

然而,当我设置的应用程序池标识的任何域帐户(即使是一个简单的,没有管理的privilages,以及不会对文件夹的任何访问该网站),它正常工作。

Ninject根据安装设置一个MVC3应用通过NuGet包教程。

我不知道,如果是相关的,网站应该在windows身份验证域联网工作。

所以,唯一的问题似乎与应用程序池标识。 至于我渴望推荐使用的方式,我喜欢有ApplicationPoolIdentity ,而不是域帐户。

可这有什么用连接? 是否有可能混合所有这些结合在一起?


下面是一个与SO类似问题线程: ASP.NET MVC 4 + Ninject MVC 3 =此对象定义无参数的构造 。 然而,在所有要么没有合适的答案在那里。


作为一个已删除的评论所说,我尝试使用NetworkSerive的身份。 和它的工作正常。 不过,我想这是不超过一个非特权域帐户要好得多。


编辑

突然发现另一相关性:应用程序池标识用于SQL Server上的Windows身份验证,但笔者预计客户端用户的凭据并在那里使用。

根据意见

一致认为,远程SQL Server可以通过模拟的验证的凭据访问。


但是它仍然是不明确的问题是ApplicationPoolIdentity和Ninject什么。

在这个问题的最顶端mentiond文章使我想,这可能由以下事实造成的,即虚拟帐户没有用户配置文件 。 这方面尚不清楚对我来说,作为一个仍然可以使IIS与加载用户配置文件LoadUserProfile属性。 我得不到的东西,什么是IIS要加载,如果有针对虚拟帐户没有配置文件?

正是在那里说:

IIS不会加载Windows用户配置文件,但某些应用程序可能会利用它反正来存储临时数据。 SQL Express是做这样的应用的一个例子。 然而,用户配置文件必须创建存储无论是在配置文件目录或注册表配置单元的临时数据。 对于网络服务帐户的用户配置文件是由系统创建的,是始终可用。 然而,随着开关独特的应用程序池的身份,没有用户配置文件是由系统创建。 只有标准应用程序池(默认应用和经典.net应用程序池)在磁盘上的用户配置文件。 如果管理员创建一个新的应用程序池没有用户配置文件被创建。

但是,如果你愿意,你可以配置IIS应用程序池通过设置“LoadUserProfile”属性为“true”加载用户配置文件。


我发现serverfault.com以下主题:

我怎样才能活动目录权限分配给默认的应用程序池标识

在那里,它也指出,应用程序池的身份是不能作为网络服务工作,特别是查询AD。

Answer 1:

从讨论的细节,听起来很像一个权限问题导致COMException抛出,这是防止Ninject从实例MainController 。 唯一的例外是有关System.DirectoryServices这是用于查询Active Directory的类。

当IIS是在正常的应用程序池帐户运行,这些帐户没有权限作出对Active Directory的查询和COMException皆可抛。 我认为,在异常(不能找到一个参数的构造函数),实际的消息是有点红鲱鱼的,是Ninject试图回落到另一个构造,因为正常的一个没有工作。

这可以解释为什么当您更改IIS应用程序池为它突然工作的域帐户运行,因为该帐户确实有权限查询域。

无论是否使用的是不是从问题明确System.DirectoryServices自己还是Ninject / IIS / ASP使用它们。 如果您使用的是他们自己,虽然,确保没有在你的AD类的构造函数可以抛出异常(抓住他们,并记录它们或东西),它会阻止你的应用程序崩溃在启动。 你可能会发现我上面有关权限的说。

如果您需要IIS为正常的应用程序池帐户(这是一个好主意)运行,但仍然查询作为AD域用户,那么你可以指定凭据DirectoryEntry和使用DirectorySearcher做AD搜索。 如果你在.NET 4.0或更高版本,那么我建议使用新System.DirectoryServices.AccountManagement类,而不是(这也让你指定的凭据)。

根据该方法,你就不需要为AD查询的任何模拟和你的应用程序池仍然可以运行为正常的应用程序池帐户。



Answer 2:

iispool \ appPoolName帐户被称为虚拟账户和加入到Windows 2008的想法去,他们不是真正的账户中的真实感觉。 他们是允许使用基本帐户进程之间增强的安全性。

你的机器上的许多服务使用network服务,内置的帐户与网络接入。 正因为如此,如果攻击者利用这些服务之一,在同一帐户下运行的任何其他进程将是可访问的。 虚拟账户,如IIS使用防止这种通过担任不同的帐户,同时仍然是相同的帐户 - 你的asp.net应用仍在运行技术作为网络服务和授予的东西这个帐户的访问shoudl仍然有效。 这也意味着,如果你需要访问网络资源时,iispool账户会做这样的网络服务也与使用的机器域帐户。

如果您正在访问远程SQL Server,这是你应该添加到允许从Web服务器访问的帐户。 我不会建议使用模拟,除非你真的很需要看到用户在SQL服务器上谁。 您的应用程序的安全性是简单的,如果你把它关闭。

至于为什么你打针不工作,也可能是您的任何依赖关系失败的。 如果controllerA与ClassB的注入而这又被注入ClassC&该类不具有D类注射,则整个链失效。 我有这种情况发生:它花了一段时间意识到这是东西,所以从我一直在寻找去除。



文章来源: How to set up IIS 7 application pool identity correctly?