繁体   English   中英

ASP.NET-从页面后面的代码访问Active Directory

[英]ASP.NET - Accessing Active Directory from code behind page

我已经制作了一个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.SitescurrentForest.GlobalCatalogs任何调用都会导致

System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException。

现在我迷路了,不知道要进一步调试什么。 我使用的帐户是Enterprise Admins(多域林)的成员。 我在运气不佳的两个具有不同IIS版本(IIS 7.5和IIS 6.0)的不同服务器上进行了尝试。

而且抛出的异常没有太大帮助:

异常详细信息:System.DirectoryServices.DirectoryServicesCOMException:发生操作错误。
源错误:当前Web请求的执行期间生成了未处理的异常。 可以使用下面的异常堆栈跟踪来标识有关异常的来源和位置的信息。

堆栈跟踪:
DirectoryServicesCOMException(0x80072020):发生操作错误。

System.DirectoryServices.DirectoryEntry.Bind(布尔throwIfFail)+557
System.DirectoryServices.DirectoryEntry.Bind()+44
System.DirectoryServices.DirectoryEntry.get_AdsObject()+42
System.DirectoryServices.DirectorySearcher.FindAll(布尔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
C:\\ Documents and Settings \\ myUser \\ documents \\ visual studio \\ Projects \\ MyWebApp \\ MyWebApp \\ ASPPage.aspx.cs:158中的myWebApp.ASPpage.Button_Click(对象发送者,EventArgs e)
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(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+2981

编辑:如果不是很明显,我想使用currentForest.Domains在整个森林(所有域)中搜索由UPN名称指定的用户。

我在此页面上的“相关问题”之一中找到了我问题的答案。 答案在以下主题中: 为什么从Web服务器以外的计算机查询Active Directory时出现DirectoryServicesCOMException?

我发现,这正是我的情况。 阅读建议的Microsoft文章后,我了解到,模拟仅适用于IIS服务器上的本地资源。 若要访问网络资源(SQL,Active Directory),我必须在Active Directory的计算机对象中设置“信任此计算机进行委派”。

这是因为IIS始终进行身份验证,因此System.Web.HttpContext.Current.User.Identity.Name显示为mydomain\\myusername; 要验证模拟是否可以工作,可以使用: System.Security.Principal.WindowsIdentity.GetCurrent().Name ,并且System.Security.Principal.WindowsIdentity.GetCurrent(true)在未模拟时也返回null。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM