Подключение к LDAP из C # с использованием DirectoryServices - PullRequest
13 голосов
/ 17 сентября 2009

Я пытаюсь подключиться к серверу edirectory 8.8, работающему под управлением LDAP. Как бы я поступил так в .Net? Могу ли я по-прежнему использовать классы в System.DirectoryService, такие как DirectoryEntry и DirectorySearcher, или они специфичны для AD? Нужно ли указывать «Строку подключения» по-другому?

Я пытаюсь что-то вроде приведенного ниже кода, но, похоже, он не работает ...

DirectoryEntry de = new DirectoryEntry ("LDAP://novellBox.sample.com","admin","password",AuthenticationTypes.None);
DirectorySearcher ds = new DirectorySearcher(de);
var test = ds.FindAll();

Есть идеи?

Ответы [ 6 ]

13 голосов
/ 17 сентября 2009

Что ж, я думаю, что ваша строка соединения немного отсутствует - недостаточно просто указать только имя сервера - вам также нужно указать "начальную точку" для поиска.

В AD это обычно будет что-то вроде контейнера «Users» в вашем домене, который вы бы указали следующим образом на языке LDAP:

LDAP://novellBox.sample.com/cn=Users,dc=YourCompany,dc=com

Не уверен, насколько LDAP-совместимы новые версии eDirectory - но это должно работать, поскольку теоретически это стандартный LDAP независимо от реализации: -)

Но опять же: только в теории нет разницы между теорией и практикой .....

Существует также пространство имен System.DirectoryServices.Protocols, которое напрямую предлагает низкоуровневые вызовы LDAP - и это определенно никак не связано с AD, но на самом деле оно довольно низкоуровневое .....

Есть также библиотека Novell C # LDAP , но я никогда не пробовал ее и не могу сказать, насколько она полна или способна. Это может дать вам некоторые подсказки!

См. Также этот вопрос Stackoverflow о Novell, LDAP и C # - он может дать вам дополнительную информацию.

5 голосов
/ 17 сентября 2009

Мне было трудно понять это, но вы могли бы использовать что-то вроде следующего, мне это понравилось:

Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com");
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery);
using (SearchResultCollection src = ds.FindAll())
{....}
4 голосов
/ 17 сентября 2009

Я думаю, вам нужно использовать синтаксис LDAP для хоста.

Убедитесь, что вы не забыли освободить соединение с помощью using - если вы не избавляетесь от записей каталога, они навсегда останутся, пока не закончится пул и ваше приложение не сломается.

using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure))
{
    ...
}
2 голосов
/ 07 марта 2013

В зависимости от конфигурации сервера каталогов вам, возможно, потребуется использовать пространство имен System.DirectoryServices.Protocols. Я написал пост о подключении к OpenLDAP с ним.

http://mikemstech.blogspot.com/2013/03/searching-non-microsoft-ldap.html

1 голос
/ 13 июня 2013

Если для внешнего LDAP требуется аутентификация с DN, попробуйте следующее: сначала получите DN пользователя, затем попробуйте аутентификацию с DN и учетными данными пользователя. Я тестировал его на Domino LDAP.

// Autheticate in external LDAP
string ldapserver = "10.1.1.1:389";
string ldapbasedn = "o=mycompany";
string ldapuser = "cn=Administrator,o=mycompany";
string ldappassword = "adminpassword";
string ldapfilter = "(&(objectclass=person)(cn={0}))";

string user = "usertest";
string password = "userpassword";
try
{
    string DN = "";
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, ldapuser, ldappassword, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        ds.Filter = string.Format(ldapfilter, user);
        SearchResult result = ds.FindOne();
        if (result != null )
        {
            DN = result.Path.Replace("LDAP://" + ldapserver + "/" , "");
        }
    }
    // try logon   
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, DN, password, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        SearchResult result = ds.FindOne();
    }
} catch (Exception) { }
1 голос
/ 22 июня 2010

Я пытаюсь подключиться к серверу edirectory 8.8, работающему под управлением LDAP. Как бы я поступил так в .Net? Могу ли я по-прежнему использовать классы в System.DirectoryService, такие как DirectoryEntry и DirectorySearcher, или они специфичны для AD?

Мы используем System.DirectoryServices для Microsoft Active Directory, OpenLDAP, работающие в Linux, и eDirectiry без каких-либо проблем. Таким образом, ответ - да, вы можете использовать эти классы для доступа к eDir.

Нужно ли указывать «Строку подключения» по-другому?

Да, вы. При передаче в DirectoryEntry строку, начинающуюся с «LDAP: //», необходимо соответствовать синтаксису LDAP, который сильно отличается от синтаксиса URI.

Я рекомендую вам использовать браузер LDAP (Google, есть много бесплатных загрузок), чтобы получить правильный путь к корневому объекту, в противном случае вы потратите время на поиск правильных типов объектов.

...