Неизвестная ошибка (0x80005000) при подключении LDAPS

Я застрял в течение последних нескольких часов на раздражающем бит 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();

Я упрощенный фактический запрос, который я хочу выполнить, к тому, который вы найдете в коде. Но даже с этим общим запросом (он должен возвращать работу над каждым объявлением?) возвращает ошибку.

3 ответов


наконец-то!

кажется, что 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

не содержит метода для проверки пользовательского сертификата.

спасибо всем за вашу помощь и время, и, надеюсь, это поможет кому-то в будущем!


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

  1. убедитесь, что " сервер.domainName " - это CN в сертификате вашего сервера AD.
  2. убедитесь, что " некоторые.domainName " хорошо разрешен добавьте разрешение в файл hosts для теста
  3. убедитесь, что" domainName " хорошо разрешен добавьте разрешение в файл hosts для теста
  4. убедитесь, что публичный ke центр сертификации, выдающий сертификат сервера, находится в хранилище доверенного корневого центра сертификации компьютера.
  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(); 

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

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