如何使用登录的人员凭据来搜索Active Directory?

时间:2010-03-04 05:40:36

标签: search active-directory asp.net-3.5 impersonation windows-authentication

我有一个网络应用程序(.NET 3.5),它通过电子邮件向用户发送通知。为此,我搜索Active Directory以查找每个人的电子邮件。

目前,我正在硬编码我自己的用户名和密码,以便搜索AD:

    Dim entry As New DirectoryEntry("LDAP://companyad", "myUsername", "myPassword", AuthenticationTypes.Secure)
    Dim srch As New DirectorySearcher(entry)
    srch.Filter = [String].Format("(&(objectClass=person)(sAMAccountName={0}))", "someOtherUsername")
    Dim result As SearchResult = srch.FindOne()

现在,显然,这并不理想,我不希望这些凭证硬编码。我的网络应用程序使用Windows身份验证。它还使用模拟(作为登录用户)来访问文件和SQL Server。是否还有一种方法让我“模仿”登录用户以搜索AD?

编辑1

我想我最好解释为什么选择这个答案。问题结果不是多跳问题或kerberos,因为我似乎已经正确设置了这些。

我最近将我的应用更改为仅允许通过web.config设置访问某个组。我之前只允许访问自己。我成立了这个小组并加入了自己的行列。然后,我删除了硬编码的凭据,并尝试在不重新启动计算机的情况下运行应用程序。

根据我的网络管理员的说法,在我重新启动计算机之前,我不会登录该新组,我认为这是导致我的问题的原因。所以,Preet的答案实际上是最准确的,因为我只需要将LDAP路径传递给DirectoryEntry。

编辑2

我还需要注册服务主体名称。

我跑了这个:

setspn -A HTTP/[dns name of the site] [machine name]

在我的开发机器上。

感谢其他人的回答。

4 个答案:

答案 0 :(得分:0)

Dim entry As New DirectoryEntry("LDAP://companyad")

工作?

答案 1 :(得分:0)

为什么不单独为此目的创建新用户?仅具有搜索权限的用户。

答案 2 :(得分:0)

我设置< identity impersonate =“true”/>在我的web.config中,将以下代码添加到我的页面加载事件处理程序中。它工作正常。你确定你没有处理多跳情况吗?在这种情况下,您的应用程序池帐户需要配置为kerberos身份验证,以支持多跳场景中的模拟。有关这方面的更多信息,请访问:http://support.microsoft.com/kb/329986

Response.Write(User.Identity.Name);
DirectoryEntry entry = new DirectoryEntry("LDAP://[mydomain.net]");
DirectorySearcher srch  = new DirectorySearcher(entry);
srch.Filter = string.Format("(&(objectClass=person)(sAMAccountName={0}))", "[user]");
SearchResult result = srch.FindOne();
Response.Write(result.Path);

答案 3 :(得分:0)

如果您希望使用Windows登录用户帐户作为AD的凭据,则必须使用以下内容:

public bool IsExistingUser() {
    DirectoryEntry de = new DirectoryEntry(Environment.UserDomainName)
    DirectorySearcher ds = new DirectorySearcher(de)
    ds.Filter = string.Format("((objectClass=user)(SAMAccountName={0}))", Environment.UserName)

    try
        SearchResult sr = ds.FindOne();
        if (sr != null && sr.DirectoryEntry.Name.Contains(Environment.UserName))
            return true;
    catch (DirectoryServicesCOMException ex)
    catch (COMException ex)
        throw new Exception("Can't find logged in user in AD", ex);

    return false;
}

假设此代码将编译并运行,它将验证您的域控制器是否知道现有登录用户。

不鼓励假冒,因为它允许在您的网络中传输密码字符串。所以,尽量避免使用它。

编辑这是AD非常有用的链接:Howto: (Almost) Everything In Active Directory via C#我发现此帖很棒!