ASP.NET - 从代码隐藏页面访问Active Directory

时间:2013-06-17 13:52:46

标签: asp.net active-directory

我创建了一个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.NamecurrentForest.RootDomaincurrentForest.ForestMode,但是对currentForest.DomainscurrentForest.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名称给定的用户的整个林(所有域)。

2 个答案:

答案 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().NameSystem.Security.Principal.WindowsIdentity.GetCurrent(true)在没有模仿时也会返回null。