4

我编写了一个应用程序,其中用户通过 LDAP 进行身份验证和登录。这真的很好用,我只是ldap_bind()用他们的凭据做一个,如果它是真的然后验证他们 - 否则,告诉他们吊起来。我可以将他们的用户名保存在会话变量中,这样我就知道他们是谁了。

现在,应用程序的一部分要求用户搜索 LDAP 以查找其他用户。我已经使用jquery-autocompleteldap_search()实现了这一点,它运行得非常好——用户只需输入用户名、名字或姓氏,所有可能的匹配项都会被建议。迷人的 :)

但是,企业 IT 甚至不允许匿名浏览网络中的目录,因此,现在,我将用户名和密码存储在其中,$_SESSION以便每次调用自动完成脚本时都可以进行新的绑定。我知道它相当安全,而且该工具只是内部的,但这感觉像是我不应该真正做的事情,如果它被“释放到野外”绝对不会做。

我想做的是在他们登录时创建与 LDAP 的绑定,然后以某种方式在整个会话中记住此身份验证,因此我们可以根据需要进行尽可能多的搜索,而不必每次都重新进行身份验证。我无法访问服务器,所以我无法更改那里的任何内容。我可以以某种方式存储成功的绑定并重$_SESSION用它吗?

如果这不是相对简单,是否有人对如何实施有任何其他建议?

4

2 回答 2

1

您不能序列化资源类型(这是 ldap_connect() 返回的)。

我们在类似情况下所做的是使用一个特定的 LDAP 帐户,该帐户仅在 LDAP 树上具有搜索权限(以及特定类型的数据,如姓名、姓氏、电子邮件),没有别的。此用户的帐户凭据存储在数据库中。

也许要应用第二级安全性,您可以允许该用户仅从特定 IP 连接(我认为 LDAP 服务器支持这一点,但我不是 100% 确定)。因此,即使凭据被泄露,它们实际上也毫无用处

于 2012-08-07T14:31:54.560 回答
0
  • 与 LDAP 兼容服务器的初始连接是匿名的
  • 成功的 BIND 请求会更改连接的身份验证状态
  • 不成功的 BIND 请求(或具有零长度 DN 和密码的 BIND 请求)会将身份验证状态重置为匿名。

因此,一旦连接通过身份验证,直到处理成功的 BIND 请求,连接将保持其身份验证状态。这意味着连接可以保持打开状态,并且可以在连接上传输操作,直到服务器或客户端关闭连接。

请注意,符合 LDAP 的服务器可以选择发送不是对客户端请求的响应的主动通知。现代、专业品质的服务器将使用这种机制来通知客户端连接正在被服务器关闭,无论出于何种原因。

简而言之,保持连接并继续使用它。更好的是,建立一个与服务器连接的身份验证池。

更新:

与符合 LDAP 的服务器的连接可以保持打开状态,并且可以用于客户端希望(并且服务器允许)的任意数量的事务(请求-响应对)。LDAP 允许每个连接进行多个事务,也允许异步连接。

于 2012-08-07T14:31:42.270 回答