【发布时间】:2013-03-18 14:45:03
【问题描述】:
将我的网站部署到 IIS7.5 后,我发现了一种奇怪的行为:当应用程序池标识默认为 ApplicationPoolIdentity(如 IIS Application Pool Identities 中所建议的那样)时,Ninject 似乎被忽略,因为我在创建第一个控制器时收到以下错误:
System.InvalidOperationException:尝试执行时出错 创建一个类型的控制器 '..MainController'。确保 控制器有一个无参数的公共构造函数。 ---> System.DirectoryServices.DirectoryServicesCOMException:一个操作 发生错误。
我尝试将FullAccess 授予IIS AppPool\<MySiteAppPool> 到包含站点(包括所有子文件夹和文件)的文件夹,但这并没有改变任何内容。
但是,当我将应用程序池标识设置为任何域帐户(即使是一个简单的,没有管理权限,也没有对站点文件夹的任何访问权限)时,它都可以正常工作。
按照Setting up an MVC3 application教程通过NuGet包安装Ninject。
我不确定,如果相关,该站点应该在具有 Windows 身份验证的域 Intranet 中工作。
所以,唯一的问题似乎是应用程序池标识。就我渴望使用推荐的方式而言,我希望拥有ApplicationPoolIdentity,而不是域帐户。
这与什么有关?是否可以将所有这些混合在一起?
这是一个有类似问题的 SO 线程:ASP.NET MVC 4 + Ninject MVC 3 = No parameterless constructor defined for this object。但是那里也没有合适的答案。
作为已删除评论的建议,我尝试使用 NetworkSerive 作为身份。它工作正常。但是,我想这并不比非特权域帐户好多少。
编辑
突然发现另一个依赖:应用程序池身份用于sql server上的windows身份验证,虽然我希望客户端用户的凭据在那里使用。
基于 cmets
同意可以使用经过身份验证的凭据通过模拟访问远程 sql 服务器。
但仍不清楚 ApplicationPoolIdentity 和 Ninject 的问题所在。
这个问题开头提到的文章让我猜想这可能是由于虚拟帐户没有用户个人资料这一事实造成的。这方面对我来说仍然不清楚,因为仍然可以启用 IIS 来加载具有 LoadUserProfile 属性的用户配置文件。我不明白,如果没有虚拟帐户的配置文件,IIS 将加载什么?
据说:
IIS 不加载 Windows 用户配置文件,但某些应用程序 无论如何可能会利用它来存储临时数据。 SQL Express 是执行此操作的应用程序示例。然而,一个用户 必须创建配置文件以将临时数据存储在 profile 目录或注册表配置单元中。用户个人资料 NETWORKSERVICE 帐户由系统创建并始终 可用的。但是,随着切换到唯一的应用程序池 身份,系统不会创建用户配置文件。只有 标准应用程序池(DefaultAppPool 和 Classic .NET AppPool) 在磁盘上有用户配置文件。如果 管理员创建一个新的应用程序池。
但是,如果需要,您可以配置 IIS 应用程序池以加载 通过将“LoadUserProfile”属性设置为“true”来获取用户配置文件。
我在 serverfault.com 上找到了以下帖子:
How can I assign active directory permission to the default app pool identity
其中还指出,应用程序池身份无法作为网络服务工作,尤其是查询 AD。
【问题讨论】:
-
您授予谁完全访问权限?
-
@V4Vendetta 我将
FullAccess授予IIS AppPool\<MySiteAppPool>到包含该站点的文件夹(包括所有子目录和文件) -
好的,你有什么额外的东西出现在事件日志中吗?
-
我的应用程序日志只获取上面发布的异常。正如 windows 日志一样,我在那里找不到任何合适的东西。
-
您可以将应用程序池留给 ApplicationPoolIdentity,然后使用 asp 模拟以特定用户登录到您的数据库。查看身份验证部分,您会看到它。关键是您的 web.config 中的
。
标签: c# asp.net asp.net-mvc-3 iis-7 ninject