3

我正在编写一些 C++/Win32 代码来搜索 LDAP 目录中的用户(实际上我需要验证用户名/密码是否正确,然后验证组成员身份)。我有用户名,所以我希望以下内容可以工作:

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

当我ldap_search用这个搜索/过滤器调用时,我必须提供一个起始基础(节点/OU/whatever)来搜索。但我不知道从哪里开始搜索——我只有用户名。是否有指定与 OpenLDAP、Active Directory、Netscape LDAP 等一起使用的树的根?

此外,任何可以回答的人都可能对此有所帮助:uid 属性是否普遍受支持,或者我是否需要根据我正在与之交谈的 LDAP 服务器品牌搜索不同的属性?(我已经看到人们需要在uid,CN甚至上搜索SAMAccountName)。

4

3 回答 3

5

关于您关于一般检索搜索库的第一个问题:

每个 LDAP 目录服务器(我认为符合 LDAP 协议)都会在一个名为RootDSE的节点下公开一些可操作的东西。您可以通过RootDSE检索的其中一件事是命名上下文,它基本上可以告诉您此服务器上托管的不同树。

因此,您可以为您的用户名搜索检索顶级搜索库。请注意:某些 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))。

于 2009-04-02T08:59:49.623 回答
2

我不会依赖 uid 作为 LDAP 中用户条目的正确搜索属性。许多公司只会保证employeeID 在LDAP DIT 中是唯一的。

于 2009-04-07T14:14:49.007 回答
0

您需要定义开始搜索的容器。所以这就像

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

其中 _ADSPath 是服务器主机名/IP;_ADSPort 为端口号(通常默认为 389);并且 _ADSRootContainer 是容器路径的其余部分(例如 ou=Users。路径取决于您正在搜索的实现。您可以启动高于容纳用户的容器并在搜索对象上设置参数以使用多级搜索。但它会慢得多。

于 2009-04-02T04:10:46.790 回答