关于 LDAP,我不明白这件事(从概念上讲,并且 - 至少我认为 - 不依赖于特定的实现)。
我注意到一个典型的 LDAP 客户端库(例如 apache DS)首先执行 connect()(某些服务器可能需要用户名/密码),然后执行 bind() 操作(这也需要用户名和密码)。
问题:
- LDAP 中的这两个步骤操作有什么意义?
- 它是否增加了额外的安全性?
- 为什么不只是一步?
- 这两个步骤的概念意义是什么?
关于 LDAP,我不明白这件事(从概念上讲,并且 - 至少我认为 - 不依赖于特定的实现)。
我注意到一个典型的 LDAP 客户端库(例如 apache DS)首先执行 connect()(某些服务器可能需要用户名/密码),然后执行 bind() 操作(这也需要用户名和密码)。
问题:
当 LDAP 客户端连接到 LDAP 服务器时,该连接是unauthenticated。客户端使用 BIND 操作来验证连接。然后,服务器使用具有特权和访问控制的连接的授权状态来处理连接上的请求。
一些(如果不是大多数)LDAP API 提供单步连接和 BIND,为此必须提供用户的凭据,或预先构建的 BIND 请求(有不同类型的 BIND 请求,简单和 SASL)。在您描述的情况下,API 很可能建立与服务器的连接,然后向服务器发出 BIND 请求。如果这成功,则设置连接的授权状态。这对客户来说是一种“方便”的方法。
将连接与 BIND (您提到的两个步骤)分开,以便可以在不同的授权状态下使用相同的连接。每个 BIND 都会重置连接的授权状态。LDAP 客户端可以连接,然后使用一个用户和凭据进行 BIND,以该用户身份执行一些操作,然后在同一连接上发送另一个 BIND 请求以将授权状态更改为不同用户的授权状态。这使客户端和服务器更加高效,因为不需要多次建立连接。这受 LDAPv3 支持。
UNBIND 请求的名称是 LDAPv2 的遗留物,它不允许每个连接有多个授权状态。UNBIND 不是 BIND 的对立面,它确实会断开连接,正如您所发现的那样。使用 LDAPv3 的 LDAP 客户端可以发送 BIND 请求以更改连接的授权状态。错误命名的 UNBIND 请求不会“取消授权”状态,它只是断开 LDAP 客户端与 LDAP 服务器的连接。
其实还是有区别的!
Connect()是指连接到指定主机名和端口上的 LDAP 服务器,因为bind()使用指定的 RDN 和密码绑定到 LDAP 目录。
希望这有帮助!