Относительно предстоящего изменения 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?