Неизвестная ошибка (0x80005000) с подключением LDAPS
Я застрял последние пару часов на раздражающем бите Active Directory.
То, что я пытаюсь выполнить, - это подключиться к Active Directory через LDAP через SSL. Тип аутентификации является анонимным. Я использую .NET Framework 4.0, С# и Visual Studio 2010.
Следующий код должен работать в соответствии с различными онлайн-ресурсами. Но он продолжает придумывать удивительные объяснения: "Неизвестная ошибка (0x80005000)".
DirectoryEntry entry = new DirectoryEntry();
entry.Path = "LDAPS://some.ldap.server:636";
entry.AuthenticationType = AuthenticationTypes.SecureSocketsLayer;
DirectorySearcher searcher = new DirectorySearcher();
searcher.searchRoot = entry;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
SearchResultCollection results = searcher.FindAll();
Я упростил фактический запрос, который я хочу выполнить, к тому, который вы найдете в коде. Но даже с этим общим запросом (он должен возвращать работу на каждый AD?) Он возвращает ошибку.
Ответы
Ответ 1
Наконец-то!
Кажется, что приложение ASP.NET не имеет прав (или не знает, как) проверять доверенное хранилище сертификатов на уровне машины. Поскольку сертификат был сам подписан, приложение ASP.NET отказалось установить соединение.
Я исправил проблему, используя собственную проверку сертификата.
Следующий код сделал трюк:
LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier("server", port));
con.SessionOptions.SecureSocketLayer = true;
con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback(ServerCallback);
con.Credential = new NetworkCredential(String.Empty, String.Empty);
con.AuthType = AuthType.Basic;
con.Bind();
Поскольку я уверен, что сертификат действителен, метод ServerCallBack выглядит следующим образом:
public static bool ServerCallBack(LdapConnection connection, X509Certificate certificate)
{
return true;
}
Но вы всегда можете получить сертификат с локального компьютера и проверить его.
В этом примере используется пространство имен:
System.DirectoryServices.Protocols;
Это потому, что пространство имен:
System.DirectoryServices.DirectoryEntry
не содержит метода проверки пользовательских сертификатов.
Спасибо всем за вашу помощь и время, и, надеюсь, это поможет кому-то в будущем!
Ответ 2
Насколько я помню Эта ошибка означает, что существует проблема с именем пути к каталогу.
- Убедитесь, что "server.domainName" является CN в сертификате вашего сервера AD.
- Убедитесь, что "some.domainName" хорошо разрешено добавить разрешение в файл вашего хоста для теста
- Убедитесь, что "domainName" хорошо разрешен, добавив разрешение в файл hosts для теста
- Убедитесь, что публикация сертификата центра сертификации, выдающего сертификат сервера, находится в хранилище доверенных корневых центров сертификации вашего компьютера.
- попробуйте сделать так:
DirectoryEntry entry = new DirectoryEntry("LDAPS://srventr2.societe.fr:636/DC=societe,DC=fr", "user", "password");
DirectorySearcher searcher = new DirectorySearcher();
searcher.SearchRoot = entry;
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
SearchResultCollection results = searcher.FindAll();
Ответ 3
В зависимости от того, как настроен ваш сервер каталогов (или элементы в вашей сети), иногда происходит простое изменение, например, это будет работать (LDAP vs. LDAPS, но оставить номер порта)
entry.Path = "LDAP://some.ldap.server:636";