我创建了一个Web应用程序,它可以从/向Active Directory读取/写入。在我的web.config文件中有
<identity impersonate="true"/>
和
<authentication mode="Windows"/>
当我显示
时System.Web.HttpContext.Current.User.Identity.Name
在某个标签中,它显示mydomain\myusername
,因此我认为模仿有效。
现在回答这个问题。当我访问运行IIS Web服务器的服务器上的应用程序时,一切都很好。但是当我从远程PC访问Web应用程序时,我得到一个例外(标签仍显示“mydomain \ myusername”)。
我已将问题追查到了。在我打电话的代码中
Forest currentForest = Forest.GetCurrentForest();
变量currentForest
知道其currentForest.Name
,currentForest.RootDomain
或currentForest.ForestMode
,但是对currentForest.Domains
,currentForest.Sites
或{{1}的任何调用}结果
System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException。
现在我迷路了,不知道要进一步调试什么。我正在使用的帐户是Enterprise Admins(多域林)的成员。我已经在两个不同的IIS版本(IIS 7.5和IIS 6.0)的不同服务器上尝试过它,但没有运气。
抛出的异常没有多大帮助:
异常详细信息:System.DirectoryServices.DirectoryServicesCOMException:发生操作错误。
源错误:在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。堆栈追踪:
DirectoryServicesCOMException(0x80072020):发生操作错误。System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)+557
System.DirectoryServices.DirectoryEntry.Bind()+44
System.DirectoryServices.DirectoryEntry.get_AdsObject()+42
System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)+98
System.DirectoryServices.ActiveDirectory.ADSearcher.FindAll()+46
System.DirectoryServices.ActiveDirectory.Forest.GetDomains()+543[ActiveDirectoryOperationException:发生操作错误。]
System.DirectoryServices.ActiveDirectory.Forest.GetDomains()+512484
System.DirectoryServices.ActiveDirectory.Forest.get_Domains()+44
myWebApp.ASPpage.Button_Click(Object sender,EventArgs e)位于C:\ Documents and Settings \ myUser \ documents \ visual studio \ Projects \ MyWebApp \ MyWebApp \ ASPPage.aspx.cs:158
System.Web.UI.WebControls.Button.OnClick(EventArgs e)+115
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)+140
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)+29
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+2981
编辑:如果不明显,我想使用currentForest.GlobalCatalogs
搜索UPN名称给定的用户的整个林(所有域)。
答案 0 :(得分:0)
我在本页的“相关问题”中找到了我的问题的答案。答案在于这个主题:Why does DirectoryServicesCOMException occur querying Active Directory from a machine other than the web server?
我发现,这正是我的情况。在阅读了建议的Microsoft文章后,我了解到,模拟仅适用于IIS服务器上的本地资源。要访问网络资源(SQL,Active Directory),我必须在Active Directory中的计算机对象中设置“信任此计算机以进行委派”。
答案 1 :(得分:0)
这是因为IIS始终进行身份验证,因此System.Web.HttpContext.Current.User.Identity.Name
显示mydomain\myusername;
以验证您可以使用的模拟是否有效:
System.Security.Principal.WindowsIdentity.GetCurrent().Name
,System.Security.Principal.WindowsIdentity.GetCurrent(true)
在没有模仿时也会返回null。