C# LDAPS Почему имя пользователя и пароль неверны в SSL, когда он работает на не ssl и достаточно ли моих изменений? - PullRequest
0 голосов
/ 06 апреля 2020

Относительно предстоящего изменения Microsoft для поддержки только LDAPS. Мы редактируем наш код подключения LDAP, чтобы он работал с LDAPS через порт 636.

В не-ssl-версии мы используем следующее для подключения:

var rootDirectoryEntryPath = "LDAP://ad-server.company.local:389/DC=company,DC=local"
var entry = string.IsNullOrEmpty(currentModel.DomainUserName)
                        ? new DirectoryEntry(rootDirectoryEntryPath)
                        : new DirectoryEntry(rootDirectoryEntryPath, currentModel.DomainUserName, currentModel.DomainUserPassword);

Для поддержки LDAPS я изменил его на следующее:

            DirectoryEntry entry;
            if (currentModel.UseSSL)
            {

                var rootDirectoryEntryPath = "LDAP://ad-server.company.local:636/DC=company,DC=local";
                entry = string.IsNullOrEmpty(currentModel.DomainUserName)
                    ? new DirectoryEntry(rootDirectoryEntryPath)
                    : new DirectoryEntry(rootDirectoryEntryPath, currentModel.DomainUserName, currentModel.DomainUserPassword, AuthenticationTypes.SecureSocketsLayer);
            }
            else
            {
                var rootDirectoryEntryPath = "LDAP://ad-server.company.local:389/DC=company,DC=local";
                entry = string.IsNullOrEmpty(currentModel.DomainUserName)
                                    ? new DirectoryEntry(rootDirectoryEntryPath)
                                    : new DirectoryEntry(rootDirectoryEntryPath, currentModel.DomainUserName, currentModel.DomainUserPassword);
            }

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

errorCode: 80090308: LdapErr: DSID-0C09041C, comment: AcceptSecurityContext error, data 52e, v4563
errorCode: System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): The user name or password is incorrect.

Как возможно, что вызов 389 работает, но 636 выдает ошибку имени пользователя / пароля? Имя пользователя и пароль одинаковы для обоих вызовов.

И является ли вышеуказанное изменение единственной вещью, которую мне нужно было бы выполнить с предстоящим изменением Microsoft? Я попытался выполнить поиск, но в связи с проблемой изменения Microsoft я не нашел подходящих результатов.

Редактировать 1 (07-04-2020 (дд-мм-гггг)) Я получил 636 для работы с кодом ниже. Совсем другой подход с использованием предложенного класса networkcredentials @ jdweng.

Для имени пользователя это всегда должно быть "CN = Имя и путь" или "домен \ имя пользователя"? Я пытался просто "Имя пользователя", но это не удалось.

Код:

 NetworkCredential creds = new NetworkCredential("company\\username", "password");
            LdapConnection connection = new LdapConnection(identifier, creds)
            {
                AuthType = AuthType.Basic,
                SessionOptions =
                {
                    ProtocolVersion = 3,
                    SecureSocketLayer = true
                }
            };

            connection.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback(VerifyServerCertificate);

            SearchRequest searchRequest = new SearchRequest(companyDN, string.Format("(&(objectClass=user))"), System.DirectoryServices.Protocols.SearchScope.Subtree, null);

            try
            {
                connection.Bind();
                var response = (SearchResponse)connection.SendRequest(searchRequest);

                Console.WriteLine(response.Entries.Count);
            }
            catch (Exception e)
            {
                Console.WriteLine($"{e}");
            }

Обратный вызов 'VerifyServerCertificateCallback' в моем тесте на данный момент всегда возвращает true в качестве теста.

Есть ли способ также использовать этот способ с LDAPConnection и NetworkCredentions для работы с DirectorySearcher?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...