虽然制作命名空间结构对目录管理员来说至关重要,但 LDAP 操作是客户端到服务器交互的核心。因此,LDAP 操作是目录的典型用户需要了解的内容,尽管好的客户端软件甚至可以从视图中抽象出这种交互。用户可能只需要搜索操作,这恰好是最详细的操作。 LDAP 标准定义了十个主要操作。管理员和程序员在管理目录信息和创建与目录信息交互的特殊业务流程时使用这个完整的集合。本章描述了十个操作中每一个的目的,并在此过程中讨论了与客户端-服务器交互相关的问题。

 The LDAP client is what a user sees of a directory

客户端-服务器交互中涉及的最明显的主题之一是 LDAP 客户端本身。客户端软件是人们发现 LDAP 目录有用且易于使用的关键。如果客户端软件要求人们理解本书,甚至本章的一小部分,他们就不会使用该目录。因此,对用户隐藏 LDAP 的精心设计的应用程序非常重要。因为搜索操作是最突出的操作,所以它在本章的前面进行了介绍。您可以探索如何创建复杂的搜索、如何使用比较运算符以及哪些客户端选项会影响搜索操作。通过了解客户端应该如何工作以及常见的客户端配置选项是什么,即使客户端软件不友好,您也可以教育用户。

LDAP operations, extensions, client services, and APIs are examined

在解决了用户最关心的主题之后,接下来我将转向与 LDAP 操作相关的其他标准操作和技术主题。此外,我还研究了一些可以使 LDAP 目录更有价值的扩展操作和控制。本章最后介绍了使用 LDAP API 的详细信息。正在开发启用目录的应用程序或服务的组织需要查看这些详细信息。目录用户将使用使用这些底层 API 编写的 LDAP 客户端软件,但一般用户不需要了解 API。例如,程序员可能会设计一个程序,在新员工加入组织时自动填写所有需要的纸质表格。第 1 章介绍的 Mycompany 的新主管在实施这样的计划后,第一天的痛苦会减轻一些。这些标准 API 是 LDAP 如此受欢迎的主要原因,因为无论客户端的操作系统如何,它们都可以工作,从而使多平台实现成为可能。附录 A 总结了 RFC 1823 中定义的标准 C 版本 API。此外,本章还简要介绍了 API C 版本中的一些函数。


Client Software

不能指望典型用户记住 LDAP 语法。良好的客户端软件是帮助用户与目录交互所必需的。您需要像检查服务器功能一样仔细检查供应商的客户端软件。客户端软件应该专注于使搜索操作,尤其是搜索过滤器的创建,易于执行。如果没有好的客户端可用,您的组织可能必须创建适合其需要的客户端界面。程序员可以设计带有搜索过滤器选项的客户端,其中包括用户友好版本的过滤器和所需的匹配运算符。


Directory-Enabled Services and Applications

许多应用程序受益于能够与目录交互以查找信息。能够作为 LDAP 客户端的应用程序或服务称为启用目录。

Applications that can interact with a directory are called directory-enabled Many e-mail services are directory-enabled

最常见的启用目录的应用程序是电子邮件服务。当电子邮件服务器收到一封电子邮件时,它可以查询目录以查明电子邮件地址收件人是否在本地站点以及该人的邮箱所在的电子邮件服务器。将此信息集中在目录中可以简化电子邮件服务器的管理,因为无需在每个电子邮件服务器上同步复制此信息。例如,sendmail 是一种常见的 UNIX 邮件服务器,可以启用目录(有关详细信息,请参阅附录 C)。 Microsoft 认识到目录支持其邮件服务器 Microsoft Exchange 2000 的重要性,并将其与 Active Directory 集成(请参阅第 7 章)。

E-mail clients can also be directory-enabled

类似地,电子邮件客户端可以启用目录,它们通过查找给定人名的目标电子邮件地址来提供有价值的服务。一些电子邮件客户端允许用户通过电子邮件应用程序中的界面浏览目录并选择电子邮件的收件人。


A Web-Based Client Interface

许多组织为其目录实施基于 Web 的客户端界面。这种方法消除了分发客户端软件和为每个平台定位合适的客户端的成本。它甚至可以帮助提供多个目录的一些有限集成。但是,如果您希望最大限度地发挥目录的潜在优势,那么明智的做法不仅仅是实现基于 Web 的客户端界面。基于 Web 的客户端与其他软件的集成很差。将客户端界面限制为浏览器限制了通过搜索目录获得的数据的有用性。扩展现有用户应用程序的功能是帮助用户利用目录的好方法。例如,如果您将用户的邮件应用程序配置为通过一个简单的命令在目录中搜索电子邮件地址,用户就会看到该目录对他们有何好处。

The limits of directory-enabled services haven't been reached yet

启用目录的服务几乎没有边界。例如,您可以使用 LDAP 目录

  1. As a certificate authority store associated with public-private
    certificate technology. This also allows you to provide a service to
    verify the validity of those certificates.
  2. To catalog the location of HTML and other types of electronic
    documents. You could then query and return a list of appropriate
    documents, just as a library catalog would do.

Microsoft 的 Active Directory LDAP 实现是一个很好的例子,说明了如何集成各种支持目录的服务。通过 Microsoft 的 Active Directory,可以将软件分发到计算机,可以设置用户和计算机配置,可以向客户宣传打印机等等。显然,将信息集中在一个目录中有很大的好处,尤其是有助于管理资源的信息。
Mycompany 只需要利用目录的创造力和集成服务来实现这一潜力。

Search

An LDAP operation consists of a client request, server work, and the results

所有 LDAP 操作都包括客户端将操作请求连同参数一起发送到服务器。服务器然后执行操作并将结果代码发送回客户端。结果代码指示操作的成功或失败。当操作是搜索操作时,服务器会在发送结果代码之前发送所有匹配搜索参数的条目。没有读取操作,因此如果目录用户想要读取特定条目,她必须执行指定条目的搜索操作。

Search parameters define what entries the server returns to the client and how it finds those entries

搜索操作有许多参数可以修改服务器执行操作的方式。有必需的强制参数,否则搜索将失败,还有可选参数,如果不另外设置,则具有默认值。搜索参数仅影响为其设置的单个搜索操作。如果要修改会话的所有 LDAP 操作,则必须使用 LDAP 选项(如果有合适的选项)。 LDAP 选项将在本章稍后讨论。不要将 LDAP 选项与可选搜索参数或第 4 章介绍的属性选项混淆

Mandatory Search Parameters

Where does the server begin looking?

The mandatory search parameters are

  1. A base DN to begin your search— An idea of how the directory is
    structured is helpful here. In other words, if you want to look up
    person entries, are they all in a common container? The base DN is
    sometimes also called the baseObject. If I didn’t know where to
    begin, I could start at the root of the directory. In Mycompany’s
    directory, this would be dc=mycompany,dc=com. So at a minimum, I
    must know the naming contexts of the directory.

    How far does the server look?

  2. The scope of the search— There are three options for the scope.
    Abase scope means to search only the single entry at the base DN. A
    one scope means to search all entries at the same level in the
    hierarchy within the container of the base DN. A subtreescope means
    to search the base DN and all entries beneath the base DN,
    regardless of their level in the hierarchy.

    What special characteristics do the entries have?

  3. A search filter— Search filters are composed of an attribute type,
    acomparison operator, and an attribute value. These three components
    are surrounded by parentheses and form a search filter item. The
    simple syntax of the search filter item is “(“attributetype operator
    attributevalue”)” with no spaces between any of these mandatory
    elements. The quotation marks enclose text that is constant in the
    syntax. For example, (objectclass=person)would be a valid search
    filter item. One or more search filter items can be combined with
    filter operators to form the search filter, so the example is also a
    valid search filter. Filter operators are introduced shortly.

为了说明搜索过滤器的使用,如果我想找到我的条目,如图 3-1 所示,我可能会使用以下搜索参数:


Figure 3-1. Mycompany with my person entry

You can use filter operators to combine filters

您可以使用筛选运算符在搜索筛选参数中组合筛选项。过滤器运算符可以修改在搜索过滤器参数中指定的过滤器项,它们可以用于组合多个过滤器以指定复杂的条目集。

The filter operators available are

& AND
| OR
! NOT

这些运算符应该在它们修改的过滤器之前。这种岁差与 LISP 语言中的函数或反向抛光计算器中的操作的表示方式非常相似。以下过滤器说明了过滤器运算符与图 3-2 中所示目录的用法。提供的所有示例都假定目录根部有一个基本 DN,以及一个子树范围。

Figure 3-2. Mycompany example for search filter operators

The filter(|(cn=Brian Arkills)(cn=Chewbacca))returns the entries of Chewbacca and me.The filter(!(|(cn=Brian Arkills)(cn= Chewbacca)))returns all entries in the entire directory except Chewbacca or my entry, so it would return the entries ofcn=Princess
Leia,cn=Han Solo,uid=barkills,upn=441276,upn=239316, as well as the tenou entries pictured. Containers are
still entries.The filter(&(!(|(cn=Brian Arkills)(cn=Chewbacca)))(objectclass=inetOrgPerson))finds all the inetOrgPersonentries except Chewbacca's or my entry, so it would return the entries of Princess Leia and
Han Solo.

The Search Operation Is Too Complicated for My Users


解释搜索操作如何工作以及强制参数(以及尚未引入的可选参数)的有效值是一项艰巨的任务。即使有很好的参考文档,大多数用户也不会理解(或者更糟,会被吓倒而不会尝试)。这是客户端软件发挥作用的地方。好的客户端软件可能已经定义了最常见的搜索类型。例如,用户只需输入姓名即可搜索某个人。该软件将识别搜索类型并向目录提供正确的参数。例如,Pine 电子邮件程序(UNIX、Windows 或基于 Web)可以预先配置为使用给定的基本 DN 和范围搜索您的目录。用户在新电子邮件的“收件人:”字段中输入姓名,程序在目录中查找地址并将其输入到电子邮件消息中。

搜索过滤器是 LDAP 搜索操作中最动态和最有趣的参数。有关搜索过滤器的更多详细信息,请参阅下一节“搜索过滤器”。

Optional Search Parameters

 Should the server return the entire entry or just some of the attributes?

可选的搜索参数是

  • 返回什么属性信息——如果你不指定你想要什么,服务器找到的条目的所有属性将被返回。您可以在以逗号分隔的列表中列出所需的属性类型。操作属性是目录用于其自身目的的属性,除非明确指定,否则永远不会返回。您还可以通过表示属性
    1.1 来指定不应返回任何属性。此名称作为与任何属性类型无关的特殊 OID 编号具有重要意义。有关操作属性和 OID 号的更多信息,请参见第 4 章。

    How should the server treat alias entries?
    
  • derefAliases——表示如何处理别名条目。 Analias
    条目是引用或指向另一个条目的虚拟条目。取消引用别名只是指示服务器转到别名引用的对象,并且出于搜索的目的,将引用的对象视为别名对象。以下选项可用(有关别名条目的更多信息,请参阅第
    5 章):

    • neverDerefAliases Don’t look up any alias reference.
    • derefInSearching Look up all alias references except on the baseObject.
    • derefFindingBaseObj Look up alias references only on the baseObject.
    • derefAlwaysLook up all alias references.

    How many entries should the server return?

  • sizeLimit——限制搜索返回的条目数。默认值 0
    表示没有限制。如果搜索发现的条目数多于指定的限制数,则仅返回第一个集合数。在这种情况下,返回结果代码
    LDAP_SIZELIMIT_EXCEEDED 以指示有更多结果可用。

    Settings in other places can modify the effects of this parameter
    

许多 LDAP 服务器实现允许目录管理员为所有客户端操作设置强制性上限。在这种情况下,客户端可以设置一个较低值的限制,但忽略大于服务器限制的限制。一些 LDAP 服务器有一个可以覆盖大小限制的特殊用户。另一个称为 LDAP 控件的修饰符可用于告诉服务器以页面的形式将结果发送回客户端。例如,目录的大小限制可能为 50,产生 100 个条目的搜索通常只返回前 50 个。但是如果我要求页面大小为 50,服务器会将前 50 个条目发送到我的客户端,然后第二个 50,我会看到所有条目。 LDAP 控件是适用于单个 LDAP 操作的修饰符。 LDAP 控件,包括这个控件,将在本章后面讨论。

How long should the server work on this request?
  • timeLimit— 限制完成搜索所允许的时间(以秒为单位)。默认值 0
    表示没有限制。如果搜索操作完成的时间超过指定的限制,则该操作将在时间限制内完成。仅返回在此时间段内找到的条目。在这种情况下,返回结果代码
    LDAP_TIMELIMIT_EXCEEDED 以指示有更多结果可用。一些 LDAP
    服务器实现允许目录管理员为所有客户端操作设置一个强制性的 uppertimeLimit。一些 LDAP
    服务器有一个特殊的用户可以覆盖服务器的时间限制。客户端可以设置较低值的限制,但忽略大于服务器限制的限制。

     Does the client want the attribute pair or just the type?
    
  • typesOnly——如果设置为真,结果将只列出属性类型,而不是值。默认值 offalse 表示应返回属性类型和值。

Search Filters

You use match operators to limit the attribute values specified in the search filter

除了过滤运算符之外,其他运算符(称为匹配运算符或比较运算符)也可以修改搜索过滤器。大多数关于该主题的文档都将匹配运算符与过滤运算符混淆了。但是匹配运算符不会对整个过滤器表达式进行操作,只会对属性值进行操作。匹配运算符通常是常见的数学运算符,例如等于或大于等于。您使用匹配运算符来帮助指定与所需属性值参数相匹配的条目。用于匹配的操作因存储在属性中的特定数据类型而异。大多数属性存储某种类型的字符串值,换句话说,文本。因此,您将使用的最常见的匹配运算符是字符串匹配运算符。以下是字符串匹配运算符:

  • = Equality— We have already looked at a few examples together.
  • <= Less than or equal to— (sn<=Arkills)would return entries
    alphabetically prior to Arkills in addition to Arkills, for example
    sn=Adams. Note that in combination with the not filter operator, you
    can create a greater-than operation that doesn’t include the entry
    that is equal.
  • = Greater than or equal to— (sn>=Arkills)would return entries after Arkills in addition to Arkills, for example sn=Chewbacca. Note that
    in combination with the not filter operator, you can create a less
    than operation.

  • ~= Approximate— (sn~=Cat)would return entries
    likesn=Scat,sn=Cast,sn=Hat, andsn=Mat. The algorithm employed for the
    approximate match filter varies depending on the implementation, so
    these examples may not work in your environment. Usually a single
    character wildcard is permitted in any position, but this is not
    standardized, and the approximate match operator isn’t always
    implemented.

搜索操作真的需要这些参数吗?

如果您在客户端请求中省略了可选参数,则将采用默认值。然而,在更大的设计意义上,是的,所有这些参数都是有用的。可选参数对返回的信息以及目录为任何客户端请求执行的工作量提供了更高级别的控制。这种控制级别使交互更加有效。

You can use a wildcard to match substring values

最后,您使用星号 (*) 作为字符串值中零个或多个字符的通配符。您可以单独使用通配符来检测属性的存在或与其他字符结合使用以查找子字符串。在图 3-3 所示的示例目录中,(cn=*Skywalker) 的搜索过滤器将返回 Luke 和 Anakin Skywalker 的条目。通配符提供的 presence 和 substring 功能都非常有用。

Figure 3-3. Example directory for wildcard match

The available match operators are linked to the type of the attribute

如前所述,该列表仅包含字符串类型的匹配运算符。对于其他类型的数据,还有其他匹配运算符。但是,这些运算符中的大多数都适用于其他数据类型,因为这些运算符在所有语法中都相当普遍。

Extended Match Filters

New match operators can be defined with LDAP v3

LDAP v3 允许您在模式中为特定数据类型定义额外的匹配运算符和规则。第 4 章的属性匹配规则部分介绍了如何为数据和属性类型定义这些匹配运算符。您可以使用扩展匹配过滤器语法在搜索过滤器中指定这些扩展匹配运算符,这与已经描述的简单搜索过滤器语法略有不同。搜索过滤器的扩展语法是

"(" attributetype [":dn"] [":" extendedoperator] ":=" attributevalue ")"

可选元素在 [括号] 中。扩展运算符通常是一个 OID,但也可以在模式中分配一个描述性名称并在过滤器中使用。

过滤器 (cn:1.2.3.4.987:=Brian Arkills) 将通过将“Brian Arkills”与其 cn 属性中的值进行比较来匹配任何条目,使用由 OID 1.2.3.4.987 表示的匹配规则定义的匹配逻辑。如果这个 OID 不表示目录支持的匹配规则(在这种情况下 OID 是作者的捏造),目录将返回一个错误代码。

The DN of entries can be searched with an extended match filter

扩展匹配过滤器还允许您在条目的 DN 中搜索值匹配项。起初这可能有点令人困惑。条目的 DN 包含目录结构中位于其上方的对象的所有 RDN。这些 RDN 可能是也可能不是条目的属性。因此,如果您想在 DN 中查找所有带有 ou=People 的条目,您将需要使用扩展匹配过滤器。现在您可能会想,“为什么不在 People OU 和一级范围内使用带有基本 DN 的搜索?”这似乎完成了同样的事情。但是考虑一下推荐可能驻留在 People OU 中的可能性。更简单的搜索将通过此引荐返回记录,从技术上讲,他们的 DN 中没有 ou=People。还要考虑目录中可能存在多个 RDN 为 ou=People 的容器的可能性。在这种情况下,没有扩展匹配过滤器的单个搜索将无法捕获所有条目。多次搜索会起作用,但这种方法可能不方便。并非所有 LDAP 服务器都支持扩展匹配过滤器搜索 DN。

Special Characters in Search Filters

You must treat special characters differently when they are used in the attribute value portion of an LDAP search filter

有几个特殊字符在搜索过滤器的属性值部分中使用时必须区别对待。您必须转义这些字符,就像您必须转义 DN 或 LDAP URL 格式中的特殊字符一样。表 3-1 列出了特殊搜索过滤器字符以及转义字符序列。

必须使用字符的十六进制值,这与引用 DN 中的特殊字符不同。

LDAP Protocol

The server does most of the work

LDAP 客户端-服务器会话最大限度地减少了客户端处理开销。服务器负责执行请求的操作并承担处理负载,同时满足客户端请求。在客户端-服务器模型中,服务器被设计为处理大的计算负载,具有更大的处理和内存容量,而客户端可能几乎没有计算能力。服务器执行请求的操作后,客户端收到来自服务器的响应或错误。除了发送请求和接收应答外,客户端几乎不做任何工作。

Table 3-1. Special search filter characters

The client can make multiple requests to multiple servers

LDAP 是基于消息的,因此客户端可以在单个会话中发出多个请求。来自同一个会话的这些多个操作每个都同时收到服务器的关注,因此可以并行执行大量工作。同一客户端的多个会话也可能同时存在,因此单个客户端可以与多个 LDAP 服务器进行交互。

The result code indicates the end of the client operation

如果客户端提交返回多个条目的搜索请求,则会向客户端返回多条消息。每个返回的条目都包含在给客户端的单独消息中;当返回所有条目时,将最终结果代码消息发送到客户端。如果返回推荐,则根据适用的设置,可能会在指示操作完成的最终结果代码之前产生额外的客户端或服务器流量。异步 LDAP API 改变了这种行为;有关详细信息,请参阅下一节 API。

LDAP uses TCP/IP and is a very efficient communicator

LDAP 传输非常有效地利用了网络流量。 LDAP 使用 TCP/IP 进行网络通信。 TCP/IP 是处理器和内存密集型的,协议中内置了错误检查,对于长度超过微不足道的会话来说,它是最有效的。 TCP 会话的启动和关闭可能会消耗大量计算机和网络资源。执行多个操作的能力使 LDAP 能够很好地利用通信资源。

客户端-服务器交互通常遵循以下模式:

  1. Client connects to server and requests a bind operation.
  2. Server returns bind operation result code (success or the process
    ends here).
  3. Client requests a search operation (or some other operation).
  4. Server returns message with located entry or entries from search
    operation. If no entries are found, no entry messages will be sent.
  5. Server sends search operation result code to client.
  6. Client requests an unbind operation.
  7. Server sends unbind result code and closes connection

请注意,结果代码很重要,因为就服务器而言,它们表示操作已完成。

CLDAP uses UDP instead of TCP and uses considerably fewer resources than LDAP

有一种与 LDAP 目录交互的形式,它比基于 TCP 交互的传统 LDAP 协议使用更少的通信开销。这种形式称为无连接 LDAP,有时缩写为 CLDAP。 RFC 1798 定义了 CLDAP,它使用 UDP 而不是 TCP。 CLDAP 事务最多可以使用比 LDAP 少三分之一的网络数据包。 CLDAP 通过限制可用操作的数量进一步简化了目录模型。 CLDAP 主要供需要在目录中快​​速查找信息的非常简单的客户端使用。可用的低开销和更简化的操作可能适合您组织的某些用途。很少有 LDAP 服务器或客户端 API 支持 CLDAP。 Messaging Direct 是支持 CLDAP 以启用大量消息服务查询的一种产品的示例。

LDAP Operations

LDAP 定义的十个操作涵盖了与目录的必要交互。有限的操作意味着客户端和服务器都易于实现并且需要有限的资源。


Problems with CLDAP


CLDAP 的主要问题是在现有 LDAP 产品中的接受度和部署。更简单的交互有很多用途,但只有有限数量的产品实现了 CLDAP。我希望看到 IETF 将 CLDAP 包含在 LDAP 核心标准中,以便更有力地促进其接受度。第二个问题来自 CLDAP 基于 UDP 的事实。 UDP 事务容易受到攻击,并且提供的错误检查和处理方式非常少。这可能会导致 Internet 上支持 CLDAP 的目录出现问题。但只要 CLDAP 可以通过开/关切换进行配置,我宁愿看到它包含在所有产品中。

Bind

Bind establishes the identity of the client

绑定操作是客户端向服务器发送的第一个请求。绑定与对目录进行身份验证是相同的任务。客户端正在向目录验证其身份,因此所有未来的操作都可以在该身份的上下文中执行。不绑定或以空字符串作为身份绑定的客户端称为匿名客户端。可以允许一个身份查看另一个身份不能查看的目录信息。绑定到目录为允许或拒绝后续操作提供授权上下文。绑定操作有两个参数:一个 DN 和一组凭证。一些 LDAP 目录被配置为支持匿名绑定,而其他目录被设计为不允许来自匿名客户端的请求。这种设计选择通常与目录中数据的敏感性有关。

Search

本章前面详细讨论了搜索操作。

Compare

Compare verifies that an attribute value is known

比较操作只是验证客户端传递的信息是否与目录中存储的信息匹配。比较操作不如搜索操作有用,除了一种关键情况,它的工作方式与搜索操作不同。如果您要求比较条目的属性,但条目中不存在该属性,则会返回一个特殊的结果代码。对不存在的属性的搜索操作不会返回任何条目,但会返回成功结果代码。比较操作具有三个参数:DN、属性类型和属性值。

例如,针对图 3-1 中描绘的目录,具有以下参数的比较操作请求将返回 TRUE 响应。

Add

Add creates new entries

添加操作允许客户端创建一个新条目。为了成功,添加操作要求客户端指定新条目将包含哪些对象类,并且该对象类的所有强制属性都提供值。服务器上的模式检查过程强制执行这些要求。此外,新条目的容器对象必须已经存在,并且现有条目不能具有相同的 DN。如果条目的对象类有结构规则,则也必须满足这些规则。最后,DN(和任何 RDN)必须采用正确的形式,并转义任何非法的特殊字符。添加操作主要有两个参数:DN(新条目的)和要包含在条目中的属性对(类型和值)。您可以指定任意数量的属性对(或对象类所需的任意数量)。

例如,使用以下参数向 Mycompany 目录发出添加操作请求将会成功。我用分号分隔属性对并用等号连接每对属性来表示属性列表。实际语法将取决于所使用的 API。

Delete

Delete removes entries

删除操作从目录中删除一个条目。与该条目关联的所有信息(条目属性的值)都将被删除。当然,要使操作成功,指定的条目必须存在。此外,该条目不能是包含子条目的容器。删除操作只有一个参数:条目的 DN。

带有以下参数的删除操作请求将删除我们刚刚在前面的添加部分中创建的条目。

在这里插入图片描述

Modify

Modify changes the attribute values of an entry

修改操作允许客户端修改条目的现有属性、删除属性值或向一个或多个属性添加值。指定的条目必须存在才能使操作成功。所有属性修改都必须成功,否则整个操作将失败。此条件避免了操作仅部分成功的不一致进入状态。它还避免了客户端需要以风险从最低到最高的顺序对属性修改进行排序。修改操作有两个参数:DN 和所需的属性修改集。

Anakin 的电话号码已更改,他急于确保电话簿反映了他的新号码,以免错过任何女士打来的电话。他还想更新他的家庭邮寄地址,以便绝地学院知道他的新家。具有以下参数的修改请求将完成工作:

ModifyRDN or Rename

ModifyRDN renames the entry or moves the entry within the directory

modifyRDN 操作允许客户端重命名目录条目。指定现有的 DN,并提供新的 RDN。重命名操作有四个参数:要重命名的 DN,条目的新 RDN,告诉服务器是否保留或删除旧 RDN 作为条目属性的标志,以及用于指定新父代的可选参数容器 DN。最后一个可选参数很重要;它不存在于 LDAP v2 标准中。它允许您将条目移动到目录中的任何位置。被移动的条目可以是一个容器,其下有子条目。如果正在移动的条目(或多个条目)正在重新定位到另一台服务器上的 DN,则操作可能会失败,具体取决于供应商的实现。在这种情况下,客户端应该准备好接收结果代码中的 affectsMultipleDSAserror。尽管指定新父 DN 的能力是满足 LDAP v3 标准的基本要求,但一些自称符合 LDAP v3 标准的 LDAP 服务器并不支持此功能。

modifyRDN 操作移动条目甚至目录树的整个部分的能力可能令人困惑。以下示例应有助于说明如何使用此操作。

每个示例都附有一张图,显示操作前后目录的外观。必须更新 Leia 的名字以反映她与 Han Solo 的婚姻。使用以下 modifyRDN 操作参数。

Figure 3-4 显示操作前后目录的外观

Figure 3-4. ModifyRDN used to modify only the RDN

Mycompany 的销售部门管理 Customers 容器,其中保存了所有客户联系信息。销售部门现在是人力资源部门的一个部门。由于 HR 部门管理 People 容器,因此 HR 部门希望将 Customers 容器移动到 People 容器下以反映组织变化。人力资源部门还想将 Customers 容器重命名为 Customer Contacts。使用了以下modifyRDN操作参数。

Figure 3-5 显示操作前后目录的外观

Figure 3-5. ModifyRDN used to both modify the RDN and move the entry

许多人都知道 Chewbacca 的绰号是 Chewie。必须更新他的姓名以包括他的正式姓名和昵称。使用以下 modifyRDN 操作参数。执行此操作后,原始 RDN 将不再是有效的 DN,但仍将作为条目的属性保留。


Figure 3-6 显示操作前后目录的外观

Figure 3-6. ModifyRDN used to modify the RDN, while leaving the old RDN


您可能期望在第二棵树上同时看到“Chewie”和“Chewbacca”。但由于篇幅限制,我无法列出每个条目的所有属性……因此假设您可以看到与所有这些条目关联的附加属性。


为什么 ModifyRDN 操作不能只有三个参数?

只使用这三个参数似乎更有效:要重命名的 DN、新 DN 以及是否删除旧 RDN 的标志。但是保持与 LDAP v2 服务器的向后兼容性比通过在版本之间进行重大更改来简化操作更为重要。 LDAP v2 和 X.500 都支持此操作,但功能较少,因此 LDAP v3 操作只是添加了一个额外的参数。

解除绑定

Unbind cleanly ends the client session

解除绑定操作允许客户端关闭它与目录的现有会话。目录有义务丢弃它所持有的任何客户证书,并停止代表客户会话的任何工作,有效地终止会话。请注意,连接,换句话说,客户端和服务器之间的TCP会话,并不一定会终止。在解除绑定操作之后,如果客户端请求一个没有绑定的新操作,新操作将在一个匿名客户端的上下文中被评估。解除绑定的操作没有参数。如果客户端在没有发出解除绑定操作的情况下终止会话,大多数LDAP实现使用会话超时参数来实现相同的目的。目录管理员可以设置这个目录范围内的超时参数。

Abandon

Abandon cancels a specific client operation request

放弃操作允许客户端告诉目录取消它请求的特定先前操作。如果客户端不想等待冗长操作的结果,这就消除了解除绑定和重新绑定的需要。此操作提高了客户端和服务器的潜在效率。放弃操作只有一个参数:客户端希望取消的操作的消息 ID。请注意,此操作可能会出现计时问题。在服务器从客户端正在取消的操作中发送完整的结果代码(和条目)后,客户端可以发送到达服务器的放弃请求。

Extended

Extended operations allow new operations to be defined and used

扩展操作是特定目录实现的占位符,用于扩展目录的功能,但仍然具有这样做的预定义语法。会话加密等附加安全功能是扩展操作的一个很好的例子。扩展操作可以像任何其他 LDAP 操作一样具有参数。 LDAP 目录必须通告 supportedExtension 属性中根 DSE 对象中可用的扩展操作。根 DSE 对象是具有空 DN 的特殊目录条目:“”

RFC 3062 defines an extended operation to modify passwords

已达到 RFC 状态的扩展操作的一个示例是 RFC 3062 中定义的密码修改扩展操作。此操作解决了组织的共同需求。传统上,LDAP 目录将身份验证信息存储在目录内部,因此每个身份验证身份都有自己的 DN。换句话说,用户名和密码与 LDAP 名称空间集成在一起。然而,现在许多 LDAP 目录主要使用 SASL 作为身份验证方式。这允许使用非 LDAP 名称空间在外部存储身份验证信息。因此,使用修改操作更改密码的传统方法在这种情况下不起作用。此扩展操作提供了一种修改目录外部密码的方法。

LDAP Controls

LDAP controls allow a client to ask the server to perform a standard operation in a slightly different way

LDAP 控件构成了一个额外的参数,它改变了标准 LDAP 操作之一的行为。控件允许 LDAP 客户端利用 LDAP 服务器支持的特殊功能。 LDAP 目录必须在 supportedControl 属性中通告根 DSE 对象中可用的控件。控件提供的特殊功能可以影响结果的返回方式,允许客户端访问通常被忽略的条目,执行通常无法通过单个操作完成的任务,或者可能伴随标准 LDAP 操作之一的其他附加功能. LDAP 控件指定有 OID,并用于客户端 API 函数的扩展版本。

The paged search control modifies the search operation by asking the server to return entries in pages

LDAP 控件的一个常见示例是分页搜索控件。此控件支持一次从服务器检索几个搜索结果的方法,而不是同时检索所有搜索结果。当客户端和服务器之间的带宽较低或预期的条目数很大时,此功能很有用。客户端指定所需的页面大小(换句话说,每个 LDAPMessage 的条目数),服务器返回较小的集合以及结果被分页的消息和预期的条目数,以便客户端可以请求其余的询问下一个分页集。此控件提供了规避在服务器上设置并影响所有会话的强制性 uppersizeLimit 的唯一方法。例如,如果目录管理员将服务器 mandatorysizeLimit 设置为 500 个条目,则正常的客户端搜索将仅返回前 500 个条目,而不会显示任何其他匹配的条目。但是使用分页搜索控件的搜索将允许客户端一次查看 500 页中的所有匹配条目。由于 sizeLimit 的限制 500 仍然被强制执行,但
是客户端仍然可以完成它的任务。

The server-side sort control returns sorted search results

另一个著名的 LDAP 控件是 RFC 2891 中定义的服务器端排序控件。此控件与搜索操作一起工作,并要求 LDAP 服务器根据客户端请求的参数对它返回的条目进行排序。参数可以包括一种或多种属性类型、匹配规则以及升序或降序。此控件旨在节省客户端处理时间和资源。

Persistent search control continues to return results indefinitely

另一个扩展搜索控件是持久搜索控件。此控件允许客户端接收有关符合提交的搜索配置文件的条目的持续更新,换句话说,基本 DN、范围和过滤器。当指定的条目更改时,会通知客户端。这种类型的功能非常有用,尤其是在您希望目录将信息提供给程序或其他目录的上下文中。遗憾的是,此控件未记录在 RFC 中,但包括 Netscape 和 Microsoft 在内的几家供应商已经实现了它。此控件的三种不同设计已提交给 IETF 征求意见:PSEARCH、TSEARCH 和 DIRSYNC。这些昵称代表所谓的 Internet 草案,即已提交但未达到 Internet 标准的提案。更糟糕的是,供应商已经开始对这三者进行细微的改动。例如,Microsoft 的 Active Directory 实现了一个 PSEARCH 版本,其 OID 与 Internet 草案中指定的不同:1.2.840.113556.1.4.528。幸运的是,一项名为 LDAP 客户端更新协议 (LCUP) 的工作正在寻求将这三种不同的实现结合在一个 RFC 中。供您参考,您可以在以下位置找到有关这些吃水控制和 LCUP 的信息 Appendix A.

LDAP controls are constantly in development to extend the functionality of LDAP

还有许多其他控件正在开发中。例如,一个草稿控件允许客户端指示目录服务器在支持链接时如何处理引用。另一个称为虚拟列表视图的草案控件允许客户端指定服务器以客户端指定的特殊顺序和编号返回搜索结果。此草案控件旨在取代现有的分页搜索控件,并将帮助电子邮件客户端更充分地与 LDAP 集成,因此可以按指定条目数在列表中浏览较长的电子邮件地址列表。很明显,LDAP 控件是一个正在进行大量开发的领域,并且正在扩展 LDAP 的功能以满足许多需求。在第二部分中,当我们查看几种 LDAP 服务器产品时,您将看到更多 LDAP 控件的示例。


控制比扩展操作更重要

扩展操作提供了一种用于定义和使用附加操作的机制。但是控件允许修改现有操作或许多现有操作。事实证明这要重要得多,因为现有的操作是全面的。作为参考,定义的新控件远多于扩展操作。

LDAP Client Options

The LDAP API is an important component of the LDAP framework

LDAP 客户端选项允许 LDAP 客户端在 LDAP 客户端会话期间指定标准设置,而不是单个操作。 LDAP 客户端选项适用于服务器会话;因此,如果客户端有一个会话向两个不同的服务器打开,则在一个会话上设置的选项不适用于另一个服务器会话。 LDAP 客户端选项不同于 LDAP 属性选项(有关这些的更多详细信息,请参阅第 4 章)。 LDAP C API 指定了几个标准的客户端选项,任何 LDAP 实现都可以定义新的选项。以下列表包含 API RFC 中列出的一些选项:

LDAP_OPT_DEREF
This option allows the client to control how aliases are handled. The valid values are- LDAP_DEREF_NEVER: Never dereference aliases.- LDAP_DEREF_SEARCHING: Don't dereference an alias at the base DN, but dereferenceotherwise.- LDAP_DEREF_FINDING: Dereference an alias at the base DN, but don't dereferenceotherwise.- LDAP_DEREF_ALWAYS: Always dereference.LDAP_OPT_SIZELIMIT
This option controls the maximum number of entries that can be returned.LDAP_OPT_TIMELIMIT
This option controls the maximum amount of time the server spends completing an operation.LDAP_OPT_REFERRALS
This option controls whether the client chases referrals. The valid values are- LDAP_OPT_ON: Chase all referrals.- LDAP_OPT_SUBORDINATE_REFERRALS: Chase only subordinate referrals.- LDAP_OPT_EXTERNAL_REFERRALS: Chase only external referrals.Significant options not defined in the API RFC that Mycompany may want its vendor to support include:LDAP_OPT_SSL
This option directs the client to use SSL on client connections.LDAP_OPT_REFERRAL_HOP_LIMIT
This option sets the maximum number of referrals a client will chase on a single operation.

APIs

LDAP client options set parameters for an entire session

RFC 1823 中指定的 C 语言 LDAP 应用程序接口 (API) 不是 LDAP 标准的一部分。但是,它非常重要,因为它有助于定义以编程方式与 LDAP 服务器交互的基本框架。尽管此 RFC 不是标准的一部分,但几乎所有供应商都实施了它。此 RFC 是标准的非官方部分,仅供使用和实施。此 RFC 基于 LDAP v2 标准。目前正在进行的工作是生成涵盖 LDAP v3 的替代 RFC。

API calls mostly map to the standard server operations

RFC 1823 中指定的函数调用主要映射到基本的 LDAP 操作。例如,考虑用于添加条目的服务器操作。有一个称为 ldap_add() 的标准 API 函数,客户端程序将使用它来请求服务器执行添加操作。

Each function has a real-time version and a version that combines results into a single response

对于每个功能,通常有两个版本。同步版本会阻塞,直到所有结果都可用。在服务器完成对请求的回复之前,调用同步版本的程序无法获得控制权。异步版本立即返回消息 ID。然后程序可以使用其他函数(提供消息 ID)来确定服务器何时返回操作结果。同步版本更易于使用,但异步版本以管理多个请求/回复为代价为您的程序提供更高的效率和自由度。同步版本在函数名称的末尾附加了一个“_s”,而异步版本则没有。例如,添加操作的同步版本是 ldap_add_s(),而异步版本是 ldap_add().

Additional versions of functions offer other functionality

一些功能不仅有同步和异步版本。一些功能支持略有不同的功能。一个函数的每组版本都被粗略地称为一个家庭,或者主要函数的朋友。

The LDAPMessage structure holds the results of the client's request, and it can be manipulated by functions

来自主要操作函数调用的结果或错误通过称为 LDAPMessage 的特殊数据结构返回。然后可以通过不映射到主要 LDAP 操作的函数调用访问此结构中的结果。这些其他功能使您可以根据需要逐步查看结果或错误。例如,一个这样的函数 ldap_first_entry() 调用在 LDAPMessage 中返回的第一个条目。然后可以使用类似 ldap_first_attribute() 的函数逐步执行此条目。函数 ldap_next_entry() 和 ldap_next_attribute() 分别允许您进入下一个条目和属性。

LDAP API functions are flexible and easy to use

有关 LDAP API 中定义的函数列表,请参阅附录 A。包含所有函数是为了突出可用的灵活性,如果您的组织想要开发使用其 LDAP 目录的应用程序。此外,完整列表可作为开发人员快速参考 LDAP API 入门。每个功能都附有简短说明。有关这些功能的更多详细信息可以在 RFC 中找到,程序员将需要咨询供应商特定的 API 实现以了解差异或重要的附加功能。

API libraries in almost every language and platform are available

有多种语言的 LDAP API 的许多不同实现。 Netscape 的 LDAP SDK 提供了 C、perl 和 Java API。 Sun 提供了 JNDI,一种 Java API。 PerLDAP SDK 使用 perl 语言。 Microsoft 提供了 ADSI SDK,它可以与任何 COM 兼容的语言一起使用,例如 C、C+、Visual Basic、Java 和 VBScript。存在许多其他 API,包括用于 PHP、ODBC、服务器端 JavaScript、ColdFusion 等的 API。关于使用 API 和在线资源的书籍应该可以让程序员轻松找到和学习所需的任何内容。

Summary

LDAP operational functionality benefits from a unique blend of standardization and entrepreneurship

LDAP目录的客户-服务器操作功能在每个供应商的产品中基本上都是标准化的。这提供了一个互操作性的基线,对LDAP的成功至关重要。当你想集中目录信息时,你会发现这个基线是非常宝贵的。然而,操作功能并不是固定的或受标准限制的。扩展操作和LDAP控制都提供了一种操作扩展的手段。这允许供应商创建独特和强大的增强功能,以推进LDAP目录的实用性。并非所有LDAP目录的操作功能都与客户机-服务器的交互有关。 事实上,该标准在很大程度上没有提到服务器与服务器之间的交互。关于这一主题的更多细节,请参见第5章。

Appendix Material

附录 A 包含有关 LDAP API 函数的参考信息,以及提到的草案控制。

Chapter 3 - Client LDAP Operations相关推荐

  1. 【Vapor】05 Chapter 7: CRUD Database Operations

    0x00 Chapter 7: CRUD Database Operations 在 routes.swift 文件内写各种路由 操作数据库的记录 1.create 创建记录,之前的文章已经写过了 需 ...

  2. 大o表示法描述复杂度_时间复杂度,空间复杂度和大O表示法

    大o表示法描述复杂度 This is the first post in my series Data Structures & Algorithms. As a boot camp grad ...

  3. centos 6.5 配置LDAP服务器+客户端!

    各种度娘!各种歌哥!网上教程参差不齐,历时1天,终于完成,不敢独享,遂,总结分享之,有问题可以留言,知无不言...开始吧 Note: 本次配置的服务器环境是<redhat enterprise ...

  4. LDAP 和 LDAP3 的对比、接口调用(1)

    一.ldap3库和python-ldap两者区别: python-ldap 主要是对OpenLDAP 的封装,同时也支持LDIF, LDAPURLs, LDAPv3.它用C+Python实现,提供的接 ...

  5. english words

    1.iterate v.反复说:重做:[计]迭代 ['ɪtəreɪt] ['ɪtəreɪt]1) Managing the caches Whenever you pass an object to ...

  6. krc 编辑 linux,Linux网络编程

    6 berkeley - 145 - struct in_addr { unsigned long s_addr; }; ina struct sockaddr_in struct in_addr i ...

  7. 【neutron】OpenStack Neutron -- 学习资料

    OpenStack Neutron -- 学习资料 学习什么 neutron代码的整体架构,消息通知.rpc如何实现,RESTful API如何实现 neutron的部署,常见问题的定位方法 neut ...

  8. Linux(CentOS)下,各种协议,端口号

    Linux(CentOS)下,各种配置文件如下: DNS:cat /etc/resolv.conf 主机名:cat etc/sysconfig/network 私有主机名:cat /etc/hosts ...

  9. 阿里云实战之一(必备程序安装)

    为了放我的在线代码编辑器,我用了阿里云的空间,用的linux服务器,空间性能见探针http://www.wcodei.com/i.php 1.安装远程操作工具 下载putty.exe,输入公网ip,端 ...

最新文章

  1. java web手动部署_tomcat手动部署web项目的方法
  2. Oracle学习:条件表达式及分组函数
  3. 安卓学习 之 多媒体技术(八)
  4. 《软件测试与质量保证》期末复习重点
  5. Linq学习之路(07) - 使用Linq进行参数化编程step by step
  6. matlab学习路线
  7. 李南江老师的视频资源
  8. VTK图像处理之vtkImageReslice
  9. android svg 线条动画教程,SVG技术入门:线条动画实现原理
  10. 站在巨人的肩膀上--邵泓鑫
  11. 跨平台为何选择Flutter?
  12. android 热修复阿里,Android热修复(阿里热修复)
  13. 四、 按键控制流水灯的运行与暂停
  14. 2020最新版前端学习路线图--微信小程序制作原来如此简单
  15. 【FPGA学习笔记】SignalTap II软件的使用
  16. python pandas合并单元格_python pandas拆分单元格
  17. Java工程师应该知道的Web安全
  18. input按钮onclick事件大全
  19. 分段函数是不是一定初等函数_分段函数是不是初等函数,那这个呢?
  20. 高通平台使用64位win7系统无法安装驱动的解决方法

热门文章

  1. CRYPTO CTF 2022 MEDIUM-EASY
  2. 软件工程概论课堂作业二维数组
  3. git删除文件(rm文件之后,文件恢复)
  4. Linux 常用命令——超详细(建议收藏)
  5. 探索格式塔心理学法则:打造令人愉悦的界面设计!
  6. 【Python】三种读取图片和显示图片的方法 pillow opencv torchvision
  7. 一篇文章学会 Python 正则表达式!
  8. (附源码)springboot在线投票系统 毕业设计 141307
  9. linux DNS服务器的部署一
  10. xp系统计算机重名明无法完成,XP电脑文件夹无法删除怎么办?