【问题标题】:Connecting to LDAP from C# using DirectoryServices使用 DirectoryServices 从 C# 连接到 LDAP
【发布时间】:2010-11-29 01:33:03
【问题描述】:

我正在尝试连接到运行 LDAP 的 edirectory 8.8 服务器。我将如何在 .Net 中执行此操作?我仍然可以使用 System.DirectoryService 中的类,例如 DirectoryEntry 和 DirectorySearcher 还是它们是特定于 AD 的?我需要以不同的方式指定“连接字符串”吗?

我正在尝试类似下面的代码,但它似乎不起作用......

DirectoryEntry de = new DirectoryEntry ("LDAP://novellBox.sample.com","admin","password",AuthenticationTypes.None);
DirectorySearcher ds = new DirectorySearcher(de);
var test = ds.FindAll();

有什么想法吗?

【问题讨论】:

    标签: c# ldap directoryservices novell edirectory


    【解决方案1】:

    好吧,我认为您的连接字符串丢失了一点 - 仅指定服务器名称还不够好 - 您还需要为搜索指定一个“起点”。

    在 AD 中,这通常类似于您域中的“用户”容器,您可以在 LDAP 用语中这样指定:

    LDAP://novellBox.sample.com/cn=Users,dc=YourCompany,dc=com
    

    不确定 eDirectory 的较新版本如何与 LDAP 兼容 - 但这应该可以工作,因为理论上它是标准 LDAP,无论实施如何 :-)

    但话又说回来:只是理论上,理论和实践没有区别.....

    还有一个 System.DirectoryServices.Protocols 命名空间,它直接提供低级 LDAP 调用 - 这绝对与 AD 无关,但它确实非常低级.....

    还有一个Novell C# LDAP library,但我从未尝试过,也不能说它有多完整或有多强大。不过,它可能会给你一些线索!

    另请参阅关于 Novell、LDAP 和 C# 的其他 Stackoverflow question - 它可能会为您提供更多信息。

    【讨论】:

    • 嗨,Marc,这个也不行。 eDirectory 似乎不喜欢它。 SE 认为连接字符串中的 DC 是非常特定于 AD 的。我已经看到了另一个问题,但试图更接近一般的 MS 实现,而不是依赖另一个实现。
    • eDir 语法很少以 dc=this,dc=that 结尾。更典型的是 ou=OrgU,o=Org 而不是 dc= 表示法。显然,您必须为搜索库提供正确的特定 DN...
    【解决方案2】:

    我很难弄清楚这一点,但您可以使用类似以下的方法,它对我很有效:

    Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com");
    DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery);
    using (SearchResultCollection src = ds.FindAll())
    {....}
    

    【讨论】:

    • 嗨 Fermin,这是连接到 edirectory 还是 AD? “域”对象似乎存在于 ActiveDirectory 命名空间中。仍在努力让它发挥作用。
    • 什么是 searchQuery?样品? .任何具有完整源代码示例应用程序的最终解决方案?恕我直言,最小化学习曲线的更好样本是具有完整源代码和良好模式的真实应用程序。
    • searchQuery 是您要查找的任何内容。 MSDN 上提供了示例:msdn.microsoft.com/en-us/library/…
    【解决方案3】:

    我认为您需要对主机使用 LDAP 语法。

    确保您不要忘记释放与 using 的连接 - 如果您不处理目录条目,它们会一直存在,直到池用完并且您的应用程序中断。

    using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure))
    {
        ...
    }
    

    【讨论】:

      【解决方案4】:

      根据目录服务器配置,您实际上可能需要使用 System.DirectoryServices.Protocols 命名空间。我写了一篇关于使用它连接到 OpenLDAP 的帖子。

      http://mikemstech.blogspot.com/2013/03/searching-non-microsoft-ldap.html

      【讨论】:

        【解决方案5】:

        如果外部 LDAP 需要使用 DN 进行身份验证,请尝试以下操作:首先检索用户的 DN,然后尝试使用 DN 和用户凭据进行身份验证。我已经在 Domino LDAP 上对其进行了测试。

        // Autheticate in external LDAP
        string ldapserver = "10.1.1.1:389";
        string ldapbasedn = "o=mycompany";
        string ldapuser = "cn=Administrator,o=mycompany";
        string ldappassword = "adminpassword";
        string ldapfilter = "(&(objectclass=person)(cn={0}))";
        
        string user = "usertest";
        string password = "userpassword";
        try
        {
            string DN = "";
            using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, ldapuser, ldappassword, AuthenticationTypes.None))
            {
                DirectorySearcher ds = new DirectorySearcher(entry);
                ds.SearchScope = SearchScope.Subtree;
                ds.Filter = string.Format(ldapfilter, user);
                SearchResult result = ds.FindOne();
                if (result != null )
                {
                    DN = result.Path.Replace("LDAP://" + ldapserver + "/" , "");
                }
            }
            // try logon   
            using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, DN, password, AuthenticationTypes.None))
            {
                DirectorySearcher ds = new DirectorySearcher(entry);
                ds.SearchScope = SearchScope.Subtree;
                SearchResult result = ds.FindOne();
            }
        } catch (Exception) { }
        

        【讨论】:

          【解决方案6】:

          我正在尝试连接到运行 LDAP 的 edirectory 8.8 服务器。我将如何在 .Net 中执行此操作?我仍然可以使用 System.DirectoryService 中的类,例如 DirectoryEntry 和 DirectorySearcher 还是它们是特定于 AD 的?

          我们将 System.DirectoryServices 用于 Microsoft Active Directory、在 Linux 上运行的 OpenLDAP 和 eDirectiry,没有任何问题。所以答案是肯定的,您可以使用这些类来访问 eDir。

          我需要以不同的方式指定“连接字符串”吗?

          是的,你是。向 DirectoryEntry 传递以“LDAP://”开头的字符串时,您需要遵守与 URI 语法非常不同的 LDAP 语法。

          我建议您使用 LDAP 浏览器(google 一下,有很多免费下载)以获得根对象的正确路径,否则您将花时间尝试找出正确的对象类型。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-10
            • 1970-01-01
            • 2022-12-24
            • 1970-01-01
            • 1970-01-01
            • 2011-08-23
            • 2019-08-21
            相关资源
            最近更新 更多