2009-09-17 2 views
13

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

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

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

Есть идеи?

ответ

11

Ну, я думаю, что строка подключения отсутствует бит - с указанием просто имя сервера недостаточно хорошее - вам также нужно указать «отправную точку» для вашего поиска.

В нашей эры, это, как правило, что-то вроде «Пользователи» контейнера в домене, который вы укажете, как это в LDAP просторечии:

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

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

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

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

Существует также Novell C# LDAP library, но я никогда не пробовал и не мог Я говорю, насколько он полна или способна. Хотя это может дать вам некоторые подсказки!

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

+0

Привет, Марк, не иди с этим. eDirectory, похоже, не нравится. SEs считают DC в строке соединения очень специфичной для AD. Я уже видел другой вопрос, но старался оставаться ближе к общей реализации MS, вместо того, чтобы зависеть от еще одной реализации. – Chaitanya

+0

Синтаксис eDir редко заканчивается на dc = this, dc = that. Более типично это было бы ou = OrgU, o = Org вместо dc = нотация. Очевидно, что для поисковой базы необходимо иметь определенное конкретное DN ... – geoffc

4

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

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

using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure)) 
{ 
    ... 
} 
5

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

Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com"); 
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery); 
using (SearchResultCollection src = ds.FindAll()) 
{....} 
+0

Hi Fermin, это подключение к справочнику или AD? объект «Домен», кажется, живет в пространстве имен ActiveDirectory. Тем не менее, попытка заставить его работать. – Chaitanya

+0

Это сработало фантастически для меня. Благодаря! – gsharp

+0

Что такое searchQuery? образцы? , Любое окончательное решение с полным приложением примера исходного кода? IMHO, лучшие образцы для минимизации кривой обучения - это настоящие приложения с полным исходным кодом и хорошими шаблонами. – Kiquenet

1

Я пытаюсь подключиться к серверу 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, есть много бесплатных загрузок), чтобы получить правильный путь к корневому объекту, иначе вы потратите время на поиск правильных типов объектов.

1

Если внешний LDAP требуется проверка подлинности с 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) { } 
Смежные вопросы