gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:39:50 25 4
gpt4 key购买 nike

我整天都在尝试解决这个问题,并且我在标准的谷歌留言板答案中阅读了一些相互矛盾的信息。

我要做的是从事件目录中检索域用户(即当前登录的用户)的电子邮件地址。我的 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?

顺便说一句,在我的开发盒上,我正在运行 IIS5,但可能会部署到 IIS6。

编辑:

按照要求:
rootQuery = @"LDAP://{0}.com/DC={0}, DC=com";
userQuery = @"(&(samAccountName={0})(objectCategory=person)(objectClass=user))";

指定正确的域和用户。

最佳答案

您试图冒充用户访问外部资源(外部含义不在同一台服务器上)。您可以这样做,但您需要在事件目录中设置委托(delegate),以便 IIS 服务器(或您现在的 WindowsXP 机器)受委托(delegate)进行委托(delegate)。如果这是您想要的方向,请查看其中一些资源以开始使用。

  • http://support.microsoft.com/kb/810572
  • http://msdn.microsoft.com/en-us/library/ff647404.aspx#paght000023_delegation

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

    关于.net - 是否可以通过在 ASP.NET 中模拟 Windows 身份验证用户从 Active Directory 中检索数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6712539/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com