【问题标题】:Generic LDAP base for search?用于搜索的通用 LDAP 基础?
【发布时间】:2010-10-17 00:30:42
【问题描述】:

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

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

当我使用此搜索/过滤器调用 ldap_search 时,我必须提供一个起始基础(节点/OU/任何内容)进行搜索。但我不知道从哪里开始搜索——我只有用户名。无论如何要指定与 OpenLDAP、Active Directory、Netscape LDAP 等一起使用的树的根?

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

【问题讨论】:

    标签: winapi active-directory ldap ldap-query


    【解决方案1】:

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

    每个 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】:

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

      【讨论】:

        【解决方案3】:

        您需要定义要在哪个容器中开始搜索。所以这类似于

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

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

        【讨论】:

          猜你喜欢
          • 2019-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-26
          • 1970-01-01
          • 1970-01-01
          • 2021-11-14
          • 1970-01-01
          相关资源
          最近更新 更多