2009-04-02 3 views
3

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

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

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

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

ответ

5

что касается вашего первого вопроса о обобщенно извлечении базы поиска:..

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

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

The RootDSE могут быть получены с помощью запроса к серверу для DN «» (пустая строка) и specifiyng, что вы хотите, чтобы получить все операционные атрибуты, а также. Пример только для сервера 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)).

+0

+1 для использования фразы "эксплуатационные предметы" –

0

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

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

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

2

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

Смежные вопросы