我一整天都在试图解决这个问题,并且我在标准谷歌留言板答案中读到了一些相互矛盾的信息。
我想做的是从活动目录中检索域用户(即当前登录用户)的电子邮件地址。我的 ASP.NET 4 网站设置为 Windows 身份验证,在 Active Directory 调用之前一切正常。
当我执行以下操作时,我在 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 配置中设置应用程序范围模拟,我也会收到相同的错误。
所以我想我的问题是,在我浪费更多时间之前,这可能吗?或者你have指定访问AD的用户名和密码?
顺便说一句,我在我的开发盒上运行的是 IIS5,但可能会部署到 IIS6。
edit:
按照要求:
rootQuery = @"LDAP://{0}.com/DC={0}, DC=com";
userQuery = @"(&(samAccountName={0})(objectCategory=person)(objectClass=user))";
指定了正确的域和用户。
您正在尝试模拟用户来访问外部资源(外部意味着不在同一服务器上)。您可以执行此操作,但需要在活动目录中设置委派,以便 IIS 服务器(或现在的 WindowsXP 机器)可信任委派。如果这是您想要的方向,请查看其中一些资源以开始使用。
- http://support.microsoft.com/kb/810572 http://support.microsoft.com/kb/810572
- http://msdn.microsoft.com/en-us/library/ff647404.aspx#paght000023_delegation http://msdn.microsoft.com/en-us/library/ff647404.aspx#paght000023_delegation
或者,为了避免正确设置和配置委派的麻烦,我只需在 Active Directory 中创建一个服务帐户并使用它即可。您可以在代码中使用凭据,就像您之前所说的那样,或者使用 web.config 中的 Impersonation 元素来模拟此服务帐户:<identity impersonate="true" userName="DOMAIN\ServiceAccount" password="password"/>.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)