从使用的DirectoryServices C#连接到LDAP(Connecting to LDAP

2019-07-18 07:52发布

我试图连接到的eDirectory 8.8服务器上运行LDAP。 我怎么会去这样做在.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();

有任何想法吗?

Answer 1:

嗯,我觉得你的连接字符串缺少位 - 仅指定的服务器名称是不够的 - 你还需要指定用于搜寻的“起点”。

在AD中,这通常是这样在你的域名,其中你会指定像这样的LDAP说法“用户”容器:

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

不知道怎么LDAP兼容的eDirectory的新版本 - 但因为在理论上,应该工作,它是标准的LDAP不管执行的:-)

不过话又说回来:只在理论上存在的理论与实践之间没有什么区别.....

还有一个System.DirectoryServices.Protocols命名它提供低级别的LDAP直接调用-这绝对不是绑的广告,但它确实相当底层的.....

还有一个Novell的C#LDAP库 ,但我从来没有尝试过,并不能说是多么完整的或能。 它可能给你一些线索,但!

也看到这个其他#1问题有关Novell,LDAP和C# -它可能给你额外的信息。



Answer 2:

我有一个很难搞清楚了这一点,但你可以使用类似下面,它为我工作甜:

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


Answer 3:

我认为你需要使用LDAP语法的主机。

确保你不要忘了与释放连接using -如果你直到池耗尽了,你的应用程式的空档不处理他们挂目录中的条目撒手人寰。

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


Answer 4:

根据ONT他的目录服务器的配置,你实际上可能需要使用System.DirectoryServices.Protocols命名空间。 我写了一张贴在连接到OpenLDAP的吧。

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



Answer 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) { }


Answer 6:

我试图连接到的eDirectory 8.8服务器上运行LDAP。 我怎么会去这样做在.net中? 我仍然可以使用在System.DirectoryService类等的DirectoryEntry和的DirectorySearcher或者他们AD具体点吗?

我们正在使用的System.DirectoryServices Microsoft Active Directory的,OpenLDAP的Linux和eDirectiry运行没有任何问题。 因此,答案是肯定的,你可以使用这些类来访问EDIR。

我需要指定“连接字符串”有什么不同?

是的,你是。 当传递到DirectoryEntry的开始字符串“LDAP://”,你需要符合LDAP语法比URI语法有很大不同。

我建议你为了得到正确的路径根对象,否则你会花时间试图找出正确的对象类型使用LDAP浏览器(谷歌,也有很多免费下载)。



文章来源: Connecting to LDAP from C# using DirectoryServices