在IIS 7中,在我为我的网站指定物理路径并单击"测试设置"按钮后,我收到以下警告:
服务器配置为使用内置帐户的传递身份验证来访问指定的物理路径.但是,IIS管理器无法验证内置帐户是否具有访问权限.确保应用程序池标识具有对物理路径的读访问权限.如果此服务器已加入域,并且应用程序池标识为NetworkService或LocalSystem,请验证该服务器是否
<domain>\<computer_name>$具有对物理路径的读访问权限.然后再次测试这些设置.
那么什么是传递身份验证?从字面上看,它应该通过一些A通过一些B?那么A和B是什么?
另外,我实际上使用的是内置的ApplicationPoolIdentity.为什么IIS无法验证此帐户是否具有对物理路径的适当访问权限?为什么我需要自己验证?
更新 - 请查看我的答案,找到解决此问题的链接和说明
在我们开始之前,我知道这是一个非常常见的问题,我一直在使用Ninject进行许多卫星没有问题,但是现在它出现了,我无法找到解决办法.此外,不,迄今为止谷歌和SO的结果都没有帮助我.
因此,请考虑从Windows Server 2008 R2上的Visual Studio 2012中的非常非常非常简单的原型ASP.NET MVC 4项目上运行的以下代码:
public class DefaultController : Controller {
private IGroupPrincipalRepository GroupPrincipalRepository { get; set; }
[Inject]
public DefaultController(
IGroupPrincipalRepository groupPrincipalRepository) {
this.GroupPrincipalRepository = groupPrincipalRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
这是NinjectWebCommon.cs RegisterServices方法:
kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor(
c =>
new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "?", "?", "?", "?"))).InSingletonScope();
Run Code Online (Sandbox Code Playgroud)
现在,这就是我使用Ninject的其他项目(但是.NET 4上的ASP.NET MVC 3)的工作原理,据我所知,这是使一切正常运行所需要的.那么,为什么我突然得到为此对象定义的无参数构造函数.异常?
UPDATE
这是完整的NinjectWebCommon.cs文件:
[assembly: WebActivator.PreApplicationStartMethod(typeof(App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(App_Start.NinjectWebCommon), "Stop")]
namespace App_Start {
using System;
using System.DirectoryServices.AccountManagement;
using System.Repositories.ActiveDirectory;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using …Run Code Online (Sandbox Code Playgroud) 感谢您的观看:希望这不仅可以帮助其他人,而且可以帮助我们!(请保持温和,这是我在Stack上的第一个问题,虽然我已经是很长时间的用户/贡献者)
情况(SNAFU) AD站点感知应用程序正在从AD中提取一些信息.此应用程序只能连接到托管服务器的Active Directory站点中的控制器; 如果没有找到该网站的控制器,我们有更大的问题,但代码将处理这种可能性.
为实现这一目标,我们打算:
所以PSEDUO代码:
System.DirectoryServices.ActiveDirectory.DirectoryServices.GetComputerSite().Name
Run Code Online (Sandbox Code Playgroud)
获取服务器所在站点的名称...然后循环
System.DirectoryServices.ActiveDirectory.DirectoryServices.ActiveDirectorySite
直到我们找到与获得的名称相匹配的网站.现在我们有了这个集合,我们可以从servers属性请求特定的服务器.最后用服务器,请求所需的AD信息.
问题:
第一步,GetComputerSite().Name返回错误:ActiveDirectoryObjectNotFoundException
在我们的开发环境中,这很好用.在我们的生产环境中它不会.
我们验证了服务器在域中并通过检查此其他堆栈文章中提到的注册表项来定义站点
更多研究引导我们阅读描述类似问题的technet文章.我们使用上面提到的powershell脚本来查看我们的Web服务器会发生什么:
[System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite()它返回了服务器和我们希望找到的8个控制器的列表; 以及正确的网站名称; 与注册表中的相同.
因此,这导致我们在默认应用程序池NetworkServices与ApplicationPoolIdentity之间存在权限差异.正如我们在此处所知,Web服务器可以看到网站和服务器......那么为什么无法使用Web应用程序呢?
我们发现通过从ApplicationPoolIdentity切换到NetWorkServices,该站点再次起作用(这恰好是开发设置并解释了为什么dev工作但生产不会.但是,因为这不再是默认的IIS 7.5配置(ApplicationPoolIdentity是);并且我们倾向于尝试保持默认值,因为补丁有时会将设置恢复为默认值...我们希望找到一个更强大的长期答案,更接近MSFT方向.
问题:
有没有更好的方法来获取服务器站点内的活动/响应控制器的句柄并获得对用户部门信息的访问权限?
需要向ApplicationPoolIdentity添加哪些权限才能允许此应用程序访问AD服务?
其他相关文章
不幸的是,到目前为止,我们发现所有人都设置了查看文件夹/文件系统的权限,但没有使用AD服务器(或者我们是否需要授予对包含正在使用的AD类的DLL的特定文件夹的访问权限?
更新: 我们认为给出错误的问题可能在于ApplicationPoolIdentity无法访问System.DirectoryServices.dll所以我们明确授予了权限
cacls.exe %windir%/assembly/System.DirectoryServices /e /t /c /p “OurAppPoolIdentityAcct”:R
Run Code Online (Sandbox Code Playgroud)
它开始工作!!!
我们无法相信它,所以我们解除了变化......并重新启动了IIS ....它仍然有效......
所以它似乎神奇地修复了自己.我们甚至只是通过从NetworkServices切换回ApplicationPoolIdenity来尝试生产,一切都开始工作了......我们不知所措,但没有进一步的调整.我们暂时监控并希望问题不会回来......不是最好的方法,但由于我们不能像以前那样重现问题,我们不知道还有什么可以尝试.
上一次更新旁边 我们发现使用应用程序池标识的IIS应用程序中引用的KB 会丢失主令牌?实际上是问题所在.我们
我们接下来的步骤是执行类似的步骤来确认此修补程序确实可以解决问题.我们会: .
.net directoryservices application-pool active-directory iis-7.5