我正在编写一些C++/Win32代码来搜索LDAP目录中的用户(实际上我需要验证用户名/密码是否正确,然后验证组成员身份).我有用户名,所以我希望以下内容可行:
(&(objectCategory=person)(objectClass=user)(uid={username}))
当我ldap_search
使用此搜索/过滤器调用时,我必须提供一个起始基(节点/ OU /无论什么)来搜索.但我不知道从哪里开始搜索 - 我只有用户名.反正是否指定将与OpenLDAP,Active Directory,Netscape LDAP等一起使用的树的根?
此外,任何能够回答这个问题的人都可能对此有所帮助:uid属性是否受到普遍支持,或者我是否需要搜索不同的属性,具体取决于我正在与哪个品牌的LDAP服务器进行通信?(我见过对需要搜索的人的引用uid
,CN
甚至SAMAccountName
).
关于您关于一般检索搜索库的第一个问题:
每个LDAP目录服务器(我认为符合LDAP协议)都会在名为RootDSE的节点下公开一些操作内容.您可以通过RootDSE检索的其中一项是namingContexts,它基本上可以告诉您在此服务器上托管的不同树.
因此,您可以检索用户名搜索的顶级搜索基础.请注意:某些LDAP(例如OpenLDAP)服务器可以托管多个树,因此您必须在找到多个命名上下文时提出解决方案.
该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)).