我一直在努力解决这个问题,而且我已经在标准的Google留言板答案中阅读了一些相互矛盾的信息。
我要做的是从活动目录中检索域用户(即当前登录用户的)电子邮件地址。我的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();
}
所以基本上我想模仿已登录的用户进行通话。 请注意,如果我将凭据直接传递给DirectoryEntry构造函数,此代码将按预期工作。另外,如果我摆脱模拟代码并在Web配置中设置应用程序范围的模拟,我会收到同样的错误。
所以我想我的问题,在我浪费任何时间之前,这是否可能?或者 指定用户名和密码来访问AD?
BTW在我的开发箱上我正在运行IIS5,但可能会部署到IIS6。
编辑:
按要求:
rootQuery = @"LDAP://{0}.com/DC={0}, DC=com";
userQuery = @"(&(samAccountName={0})(objectCategory=person)(objectClass=user))";
指定了正确的域和用户。
答案 0 :(得分:5)
您正在尝试模拟用户访问外部资源(外部意义不在同一服务器上)。您可以执行此操作,但是您需要在活动目录中设置委派,以便IIS服务器(或现在的WindowsXP框)受信任以进行委派。如果这是您想要的方向,请查看其中的一些资源。
或者,为了避免正确设置和配置委派的麻烦,我只需在活动目录中创建一个服务帐户并使用它。您可以使用代码中的凭据,就像您之前说过的那样,或使用web.config中的Impersonation元素来模拟此服务帐户:<identity impersonate="true" userName="DOMAIN\ServiceAccount" password="password"/>.
答案 1 :(得分:2)
正如@Patricker所提到的,您必须启用委派以支持此方案。还要确保使用支持委派的身份验证机制。如果使用Kerberos对Web服务器的用户进行身份验证,则可以进行委派,但不能使用NTLM [1]进行委派。如果您使用基本身份验证,则也可以进行委派(因为Web服务器可以访问客户端的用户名和密码)。
答案 2 :(得分:1)
如果我没记错的话,如果应用程序池作为网络服务与域帐户运行,则存在一些挑战。你的配置如何?
另外,你可以发布rootQuery的值和userQuery的结果值吗?
答案 3 :(得分:1)
答案 4 :(得分:0)
还注意到在代码中搜索LDAP的方式看起来非常昂贵。您可能希望使用sid搜索来查询LDAP,该搜索可以在attached link
中找到