Неизвестная ошибка (0x80005000) с подключением LDAPS - PullRequest
11 голосов
/ 03 апреля 2012

Последние пару часов я застрял на раздражающем бите Active Directory.

То, что я пытаюсь сделать, это подключиться к Active Directory через LDAP через SSL. Тип аутентификации анонимный. Я использую .NET Framework 4.0, C # и 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?) Он возвращает ошибку.

Ответы [ 3 ]

13 голосов
/ 11 апреля 2012

Наконец!

Кажется, что приложение 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 голосов
/ 04 апреля 2012

Насколько я помню, эта ошибка означает, что есть проблема с именем пути к каталогу.

  1. Убедитесь, что "server.domainName" является CN в сертификате вашего сервера AD.
  2. Убедитесь, что «some.domainName» правильно разрешено, добавьте разрешение в файл hosts для теста
  3. Убедитесь, что «domainName» правильно разрешено, добавьте разрешение в файл hosts для теста
  4. Убедитесь, что общедоступный ключ центра сертификации, который выдает сертификат сервера, находится в хранилище доверенных корневых центров сертификации вашего компьютера.
  5. попробуйте сделать так:

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(); 
1 голос
/ 04 апреля 2012

В зависимости от того, как настроен ваш сервер каталогов (или элементы в вашей сети), иногда простое изменение может сработать (LDAP или LDAPS, но оставить номер порта)

entry.Path = "LDAP://some.ldap.server:636";
...