如何连接到本地安装的OpenLDAP服务?

时间:2012-02-07 06:39:51

标签: .net c#-3.0 ldap openldap

我一直在攻击.Net 3.5 PrincipalContext,尝试建立与OpenLDAP的连接,该连接与我的Visual Studio 2010 IDE安装在同一台机器上(机器名为dev001)。

这是我简单的LDAP结构:

  • base(dc = test,dc = com)
    • testadmin(cn = testadmin,dc = test,dc = com)
    • 帐户(dc = accounts,dc = test,dc = com)
      • testuser(cn = testuser,dc = accounts,dc = test,dc = com)

以下是我尝试过的代码段:

Snippet#1 :名称组合:“localhost”,“localhost:389”,“dev001”,“dev001:389”,“test”,“test.com”

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "localhost", "dc=accounts,dc=test,dc=com", "cn=testadmin,dc=test,dc=com", "testadminpassword");

Snippet#2 名称组合:“localhost”,“localhost:389”,“dev001”,“dev001:389”,“test”,“test.com”

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "localhost", "dc=accounts,dc=test,dc=com", "testadmin", "testadminpassword");

我还没有与服务器建立连接。

当我使用“localhost”,“localhost:389”,“dev001”,“dev001:389”或“test”时,我收到错误:

System.NullReferenceException:未将对象引用设置为对象的实例。

当我使用“test.com”时,我收到错误:

System.DirectoryServices.AccountManagement.PrincipalServerDownException:无法联系服务器。 ---> System.DirectoryServices.Protocols.LdapException:LDAP服务器不可用。

1 个答案:

答案 0 :(得分:0)

您的第一个问题是使用System.DirectoryServices命名空间。那里的类​​只适用于Active Directory。我很久以前就把它放在System.DirectoryServices.Protocols命名空间以及大多数其他人身上。这里有一些代码可以帮助您开始连接。

var host = "localhost:389";
var credential = new NetworkCredential("user", "secret");

using (var con = new LdapConnection(host) { Credential = credential, AuthType = AuthType.Basic, AutoBind = false })
{
    con.SessionOptions.ProtocolVersion = 3;
    con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback(VerifyCertDelegate);
    //con.SessionOptions.StartTransportLayerSecurity(new DirectoryControlCollection());
    con.Bind()
    //Do other ldap operations here such as setting the user password
    var pass = "newpass";
    var req = new ModifyRequest
    {
        DistinguishedName = "cn=user,ou=test,dc=example,dc=com"
    };

    var dam = new DirectoryAttributeModification
    {
        Name = "userPassword",
        Operation = DirectoryAttributeOperation.Replace
    };
    dam.Add(pass);
    req.Modifications.Add(dam);

    con.SendRequest(req);
}

请注意,上面的TLS已关闭。如果你想要一个安全的连接,请在端口636上使用ssl。微软ldap库有一个竞争条件,当你在网络服务器环境中进行两次同时的ldap调用时,会导致你的cpu在无限循环中出现峰值。