Общая база LDAP для поиска? - PullRequest
       66

Общая база LDAP для поиска?

3 голосов
/ 02 апреля 2009

Я пишу некоторый код C ++ / Win32 для поиска пользователя в каталоге LDAP (на самом деле мне нужно проверить правильность имени пользователя / пароля и затем проверить членство в группе). У меня есть имя пользователя, поэтому я надеюсь, что что-то вроде следующего будет работать:

(&(objectCategory=person)(objectClass=user)(uid={username}))

Когда я вызываю ldap_search с этим поиском / фильтром, я должен предоставить начальную базу (узел / OU / что угодно) для поиска. Но я не знаю, с чего начать поиск - все, что у меня есть, это имя пользователя. Можно ли в любом случае указать корень дерева, который будет работать с OpenLDAP, Active Directory, Netscape LDAP и т. Д., И т. Д.?

Кроме того, любой, кто может ответить, может, вероятно, помочь с этим: универсально ли поддерживается атрибут uid или мне нужно искать другой атрибут в зависимости от того, с какой маркой сервера LDAP я говорю? (Я видел ссылки на людей, которым нужно искать по uid, CN и даже SAMAccountName).

Ответы [ 3 ]

5 голосов
/ 02 апреля 2009

Относительно вашего первого вопроса об общем поиске базы поиска:

Каждый сервер каталогов LDAP (в соответствии с протоколом LDAP, я думаю) предоставляет некоторые рабочие вещи в узле, называемом RootDSE . RootDSE можно получить с помощью namingContexts , который, по сути, может сказать вам, какие различные деревья размещены на этом сервере.

Таким образом, вы можете получить базу поиска верхнего уровня для поиска по имени пользователя. Обратите внимание: на некоторых серверах LDAP (например, OpenLDAP) может размещаться несколько деревьев, поэтому вам нужно найти решение, когда найдено несколько контекстов именования.

RootDSE можно получить, запросив у сервера DN "" (пустая строка) и указав, что вы также хотите получить все рабочие атрибуты. Просто пример сервера OpenLDAP:

ldapsearch -H ldap://ldap.mydomain.com -x -s base -b "" +
# note the + returns operational attributes

Это должно вернуть что-то похожее на то, что показано ниже (из OpenLDAP 2.4.8) - значения в скобках являются дополнительными пояснениями и не возвращаются сервером:

dn:
structuralObjectClass: OpenLDAProotDSE
configContext: cn=config
namingContexts: dc=example,dc=com
namingContexts: dc=example,dc=net
monitorContext: cn=Monitor
supportedControl: 1.3.6.1.4.1.4203.1.9.1.1 (Contentsync RFC 4530)
[...]
supportedExtension: 1.3.6.1.4.1.4203.1.11.1 (ModifyPassword RFC3088)
[...]
supportedFeatures: 1.3.6.1.1.14 (Modify-Increment RFC4525)
[...]
supportedLDAPVersion: 3
supportedSASLMechanisms: NTLM
[...]
entryDN:
subschemaSubentry: cn=Subschema

( от http://www.zytrax.com/books/ldap/ch3/#operational)


Относительно вашего второго вопроса о доступности атрибута uid:

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

2 голосов
/ 07 апреля 2009

Я бы не стал полагать, что uid является правильным атрибутом поиска для записей пользователя в LDAP. Многие компании гарантируют, что employeeID является уникальным в LDAP DIT.

0 голосов
/ 02 апреля 2009

Вы должны определить, в каком контейнере начать поиск. Так что это будет что-то вроде

"LDAP://" + _ADSPath + ":" + _ADSPort + "/" + _ADSRootContainer

где _ADSPath - имя хоста сервера / ip; _ADSPort - номер порта (обычно 389 по умолчанию); _ADSRootContainer - это остальная часть пути к контейнеру (например, ou = Users. Путь будет зависеть от реализации, которую вы ищете. Вы можете запустить выше, чем контейнер, содержащий пользователей, и установить параметры для объекта поиска, чтобы использовать многоуровневый поиск. Но это будет намного медленнее.

...