Подключение к серверу LDAP из .NET - PullRequest
3 голосов
/ 02 января 2012

Мне рекомендовано использовать System.DirectoryServices.Protocols, чтобы иметь возможность поддерживать подключение к серверам LDAP, отличным от Active Directoy здесь .
К сожалению, я не смог найти каталог должным образом. Я хотел бы иметь возможность получить определенный атрибут для пользователя (например, mail). Это легко сделать в пространстве имен System.DirectoryServices с помощью класса DirectorySearcher. Как я могу добиться того же в System.DirectoryServices.Protocols пространстве имен. Вот что у меня есть:

var domainParts = domain.Split('.');
string targetOu = string.Format("cn=builtin,dc={0},dc={1}", domainParts[0], domainParts[1]);
string ldapSearchFilter = string.Format("(&(ObjectClass={0})(sAMAccountName={1}))", "person", username);

// establish a connection to the directory
LdapConnection connection = new LdapConnection(
                                new LdapDirectoryIdentifier(domain),
                                new NetworkCredential() { UserName = username, 
                                                   Password = "MyPassword" });
SearchRequest searchRequest = new SearchRequest(
                targetOu, ldapSearchFilter, SearchScope.OneLevel, new[] {"mail"});

Этот код вызывает исключение типа DirectoryOperationException с сообщением The object does not exist.

Я подозреваю, что что-то не так с моими переменными targetOu и ldapSearchFilter.

Спасибо.

1 Ответ

3 голосов
/ 02 января 2012

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

Так что, если вы собираетесь использовать LDAP без Active Directory, вы должны использовать что-то еще для поиска - например, sn (для фамилии или фамилии), givenName (имя), возможно displayName.

Еще один интересный вариант может быть использовать ANR (неоднозначныйразрешение имен) поиски - см. эту страницу в SelfADSI примерно посередине, где объясняется ANR.

С ANR вы бы написали свой запрос следующим образом:

string ldapSearchFilter = 
   string.Format("(&(ObjectCategory={0})(anr={1}))", "person", username);

Я также изменил ObjectClass на ObjectCategory по двум причинам:

  • ObjectCategory имеет одно значение, например, содержит только одно значение (ObjectClass является многозначным)
  • ObjectCategory обычно индексируется, и, следовательно, поиск обычно выполняется намного быстрее с использованием ObjectCategory

Возвращает ли это искомые результаты?

...