我正在编写一些C ++ / Win32代码来搜索LDAP目录中的用户(实际上我需要验证用户名/密码是否正确,然后验证组成员身份)。我有用户名,所以我希望以下内容能有效:
(&(objectCategory=person)(objectClass=user)(uid={username}))
当我使用此搜索/过滤器调用ldap_search
时,我必须提供一个起始基(节点/ OU /无论如何)来搜索。但我不知道从哪里开始搜索 - 我只有用户名。反正是否指定将与OpenLDAP,Active Directory,Netscape LDAP等一起使用的树的根?
此外,任何能够回答这个问题的人都可能对此有所帮助:uid属性是否受到普遍支持,或者我是否需要搜索不同的属性,具体取决于我正在与哪个品牌的LDAP服务器进行通信? (我看过有人需要在uid
,CN
甚至SAMAccountName
上搜索的人。
答案 0 :(得分:5)
关于您关于一般检索搜索库的第一个问题:
每个LDAP目录服务器(我认为符合LDAP协议)都会在名为 RootDSE 的节点下公开一些操作内容。您可以通过 RootDSE 检索的其中一项是 namingContexts ,它基本上可以告诉您在此服务器上托管的不同树。
因此,您可以检索用户名搜索的顶级搜索基础。 请注意:某些LDAP(例如OpenLDAP)服务器可以托管多个树,因此您必须在找到多个命名上下文时提出解决方案。
可以通过向服务器查询DN“”(空字符串)来检索 RootDSE ,并指定您还要获取所有操作属性。只是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))。
答案 1 :(得分:2)
我不会依赖uid作为LDAP中用户条目的正确搜索属性。许多公司只会保证employeeID在LDAP DIT中是唯一的。
答案 2 :(得分:0)
您需要定义要开始搜索的容器。所以这就像
"LDAP://" + _ADSPath + ":" + _ADSPort + "/" + _ADSRootContainer
其中_ADSPath是服务器主机名/ ip; _ADSPort是端口号(默认情况下通常为389);和_ADSRootContainer是容器路径的其余部分(如ou = Users。 路径取决于您要搜索的实现。您可以启动高于持有用户的容器,并在搜索对象上设置参数以使用多级搜索。但它会慢很多。