是否可以通过在ASP.NET中模拟Windows身份验证用户从Active Directory检索数据?

Eri*_*rix 5 .net asp.net .net-4.0 active-directory windows-authentication

我一直在努力解决这个问题,而且我已经阅读了标准谷歌留言板答案中的一些相互矛盾的信息.

我要做的是从活动目录中检索域用户(即当前登录用户的)电子邮件地址.我的ASP.NET 4网站是为Windows身份验证设置的,一切正常,直到活动目录调用.

当我执行以下操作时,我在search.findAll()行上得到一个COMException.异常消息是"发生操作错误"(非常有用的消息呃?)(为了便于阅读,删除了代码)

WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext wic = null;

wic = winId.Impersonate();
using (DirectoryEntry root = new DirectoryEntry(rootQuery))
{
      String userQuery = GetUserQuery();
      DirectorySearcher searcher = new DirectorySearcher(root);
      searcher.SearchScope = SearchScope.Subtree;
      searcher.Filter = userQuery;

      SearchResultCollection results = searcher.FindAll();
      return (results[0].Properties["proxyaddresses"][0]).ToString();
}
Run Code Online (Sandbox Code Playgroud)

所以基本上我想模仿登录用户进行通话.请注意,如果我将凭据直接传递给DirectoryEntry构造函数,此代码将按预期工作.此外,如果我摆脱模拟代码并在Web配置中设置应用程序范围的模拟,我会收到相同的错误.

所以我想我的问题,在我浪费任何时间之前,这是否可能?或者您是否必须指定用户名和密码才能访问AD?

在我的开发盒上BTW我正在运行IIS5,但可能会部署到IIS6.

编辑:

按照要求:

rootQuery = @"LDAP://{0}.com/DC={0}, DC=com";
userQuery = @"(&(samAccountName={0})(objectCategory=person)(objectClass=user))";
Run Code Online (Sandbox Code Playgroud)

使用适当的域和用户指定.

Pet*_*ter 5

您正在尝试模拟用户访问外部资源(外部意义不在同一服务器上).您可以这样做,但是您需要在活动目录中设置委派,以便IIS服务器(或者您现在的WindowsXP框)受信任以进行委派.如果这是您想要的方向,请查看其中的一些资源以开始使用.

或者,为了避免正确设置和配置委派的麻烦,我只需在活动目录中创建一个服务帐户并使用它.您可以使用代码中的凭据,就像您之前说过的那样,或使用web.config中的Impersonation元素来模拟此服务帐户:<identity impersonate="true" userName="DOMAIN\ServiceAccount" password="password"/>.