Как подключиться к локально установленному сервису OpenLDAP? - PullRequest
1 голос
/ 07 февраля 2012

Я ударился головой о .Net 3.5 PrincipalContext, пытаясь установить соединение с OpenLDAP, установленным на той же машине, что и моя Visual Studio 2010 IDE (имя машины dev001).

Вот моя простая структура LDAP:

  • base (dc = test, dc = com)
  • testadmin (cn = testadmin,dc = test, dc = com)
  • учетные записи (dc = account, dc = test, dc = com)
  • testuser(cn = testuser, dc = account, dc = test, dc = com)

Вот фрагменты кода, которые я пробовал:

Фрагмент # 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");

Фрагмент # 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 голосов
/ 08 февраля 2012

Ваша первая проблема - использование пространства имен 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 выключен. Если вам нужно безопасное соединение, используйте ssl на порту 636. В библиотеках Microsoft ldap есть условие состязания, которое заставит ваш процессор работать с бесконечным циклом, когда два одновременных вызова ldap выполняются, например, в среде веб-сервера.

...