ApplicationPoolIdentity
(根据 IIS应用程序池标识 的建议),Ninject
似乎被忽略了,因为在创建第一个控制器时会出现以下错误:
我尝试授予System.InvalidOperationException: 尝试创建类型为“..MainController”的控制器时出错。请确保控制器具有无参数公共构造函数。 ---> System.DirectoryServices.DirectoryServicesCOMException: 发生操作错误。
IIS AppPool \<MySiteAppPool>
对包含站点的文件夹(包括所有子文件夹和文件)的FullAccess
,但这没有改变任何内容。然而,当我将应用程序池标识设置为任何域帐户(甚至是简单的账户,没有管理员特权,也没有访问站点文件夹的任何权限), 它可以正常工作。
Ninject是通过NuGet软件包根据设置MVC3应用程序教程安装的。
我不确定这是否相关,该站点应该在具有Windows身份验证的域Intranet中工作。
因此,唯一的问题似乎与应用程序池标识有关。 尽管我很想使用推荐的方式,但我希望拥有
ApplicationPoolIdentity
,而不是域帐户。这可能与什么相关? 是否可以将所有这些混合在一起?这里有一个类似问题的 SO 帖子:ASP.NET MVC 4 + Ninject MVC 3 = No parameterless constructor defined for this object,但那里也没有合适的答案。根据删除的评论建议,我尝试使用 NetworkService 作为标识并且它可以正常工作。然而,我猜这好像并不比非特权域帐户好多少。编辑后,我突然发现另一个依赖项:应用程序池标识在 SQL Server 上用于 Windows 身份验证,尽管我希望客户端用户的凭据在那里使用。同意通过模拟来访问远程 sql server 可以使用经过身份验证的凭据解决问题。但是 ApplicationPoolIdentity 和 Ninject 的问题仍然不清楚。文章提到的问题使我想到可能是由于虚拟帐户没有用户档案引起的。对我来说,这个方面仍然不清楚,因为你仍然可以使用 LoadUserProfile 属性启用 IIS 加载用户档案。如果虚拟帐户没有档案,IIS 要加载什么我就不明白了?据说:
管理员创建新的应用程序池。IIS 不会加载 Windows 用户档案,但某些应用程序可能仍会利用它来存储临时数据。SQL Express 是这样一个应用程序的例子。但是,用户档案必须被创建才能将临时数据存储在档案目录或注册表中。NETWORKSERVICE 帐户的用户档案由系统创建并始终可用。然而,随着切换到唯一的应用程序池标识,系统不会创建用户档案。只有标准应用程序池(DefaultAppPool 和 Classic .NET AppPool)在磁盘上具有用户档案。如果使用自定义帐户,则不会创建用户档案。
但是,如果需要,可以通过将“LoadUserProfile”属性设置为“true”来配置IIS应用程序池以加载用户配置文件。
我在serverfault.com上找到了以下线程:
其中还说明了应用程序池标识无法作为网络服务工作,特别是无法查询AD。
FullAccess
授权给IIS AppPool\<MySiteAppPool>
,以便访问包含站点的文件夹(包括所有子目录和文件)。 - horgh