Подключение к LDAP с С# с помощью DirectoryServices
Я пытаюсь подключиться к серверу 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();
Любые идеи?
Ответы
Ответ 1
Ну, я думаю, что ваша строка соединения немного отсутствует - указание только имени сервера недостаточно, вам также нужно указать "отправную точку" для вашего поиска.
В AD это обычно будет чем-то вроде контейнера "Пользователи" в вашем домене, который вы бы указали так на языке LDAP:
LDAP://novellBox.sample.com/cn=Users,dc=YourCompany,dc=com
Не знаете, как LDAP совместим с более новыми версиями eDirectory, но это должно работать, поскольку теоретически это стандартный LDAP независимо от реализации: -)
Но опять же: только в теории нет никакой разницы между теорией и практикой.....
Также существует пространство имен System.DirectoryServices.Protocols
, которое предлагает низкоуровневые вызовы LDAP - и это определенно не привязано к AD вообще, но оно действительно довольно низкоуровневое.....
Там также библиотека Novell С# LDAP, но я никогда не пробовал и не могу сказать, насколько она полна или способна. Это может дать вам некоторые подсказки, хотя!
Также см. этот другой fooobar.com/questions/390034/... о Novell, LDAP и С# - он может предоставить вам дополнительную информацию.
Ответ 2
Мне было трудно понять это, но вы могли бы использовать что-то вроде следующего: это работало для меня сладко:
Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com");
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery);
using (SearchResultCollection src = ds.FindAll())
{....}
Ответ 3
Я думаю, вам нужно использовать синтаксис LDAP для хоста.
Убедитесь, что вы не забыли освободить соединение с помощью using
- если вы не избавляетесь от записей в каталоге, которые они вешают навсегда, пока не закончится пул и ваше приложение не сломается.
using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure))
{
...
}
Ответ 4
В зависимости от конфигурации сервера каталогов вам может потребоваться использовать пространство имен System.DirectoryServices.Protocols. Я написал сообщение о подключении к OpenLDAP с ним.
http://mikemstech.blogspot.com/2013/03/searching-non-microsoft-ldap.html
Ответ 5
Я пытаюсь подключиться к серверу 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 it, есть много бесплатных загрузок), чтобы получить правильный путь к корневому объекту, иначе вы потратите время на поиск правильных типов объектов.
Ответ 6
Если внешний 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) { }