Использование LdapConnection для перечисления AD - PullRequest
3 голосов
/ 03 февраля 2012

Можно ли использовать LdapConnection из System.DirectoryServices.Protocols для запроса Active Directory?

У меня проблемы с созданием PrincipalContext. Вот мой код, на случай, если кто-нибудь сможет определить проблему:

    private LdapConnection getLdapConnection(string username, string password, string ldapServer, bool secured)
    {
        int port = secured ? 636 : 389;

        LdapConnection connection = new LdapConnection(new LdapDirectoryIdentifier(ldapServer, port, false, false));

        if (secured)
        {
            connection.SessionOptions.ProtocolVersion = 3;
            connection.SessionOptions.SecureSocketLayer = true;
        }


        connection.Credential = new NetworkCredential(username, password);
        connection.AuthType = AuthType.Basic;
        connection.SessionOptions.VerifyServerCertificate += (conn, cert) => { return true; };
        connection.Bind();

        return connection;
    }

При попытке создать экземпляр основного контекста, который я использую

        PrincipalContext context = new PrincipalContext(
            ContextType.Domain,
            ldapServer,
            null,
            useSsl ? ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind : ContextOptions.SimpleBind,
            username,
            password);

Я передаю те же значения, для полноты имени пользователя в формате domain\user и ldapServer в формате server.domain.com с ldapServer, добавив: 636 при создании основного контекста. *

Сервер, к которому я подключаюсь, имеет проблемы с сертификатами, которые, я полагаю, могли бы предотвратить это, так как LdapConnection настроен на возврат true для проверки. Это не проблема, так как ей доверяют. У меня нет доступа к серверу, и я не могу это изменить.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Насколько я понимаю, параметр контейнера не может быть null, когда вы выбираете домен.Можете ли вы просто попробовать этот конструктор:

PrincipalContext domainContextMonou = new PrincipalContext(ContextType.Domain,
                                                           "server.domain.com :389",
                                                           "dc=domain,dc=com",
                                                           username,
                                                           password);

А затем этот:

PrincipalContext domainContextMonou = new PrincipalContext(ContextType.Domain,
                                                           "server.domain.com :636",
                                                           "dc=domain,dc=com",
                                                           useSsl ? ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind : ContextOptions.SimpleBind,
                                                           username,
                                                           password);
0 голосов
/ 05 февраля 2012

Я подозреваю, что частью вашей проблемы с кодом LDAP является то, что вы используете AuthType.Basic. Попробуйте Negotiate вместо этого.

...