Python LDAP模块---我必须始终运行“whoami_s()”才能成功进行身份验证吗?

时间:2013-11-13 01:52:08

标签: python ldap bind ldap-query

幸运的是,这段代码仅用于测试,并且足够短,可以完全复制/粘贴到此处。基本上,我需要绑定到一个dn,以获取我的搜索的具体细节。否则,如果没有绑定,它会匿名绑定,然后我只能获得准系统信息。除非我在绑定后明确运行whoami_s(),否则我似乎无法成功绑定。

不起作用的代码(匿名绑定):

l = ldap.initialize("ldap://myldapserver")
l.simple_bind("cn=test,ou=profile,dc=site,dc=com", "abc123")
basedn = "ou=people,dc=site,dc=com"
filter = "uid=bob"
results = l.search_st(basedn, ldap.SCOPE_SUBTREE, filter)
for entry in results:
   print entry

有效的代码(成功绑定并提供所有可能的详细信息):

l = ldap.initialize("ldap://myldapserver")
l.simple_bind("cn=test,ou=profile,dc=site,dc=com", "abc123")
l.whoami_s()  ### <---- This is the only difference ###
basedn = "ou=people,dc=site,dc=com"
filter = "uid=bob"
results = l.search_st(basedn, ldap.SCOPE_SUBTREE, filter)
for entry in results:
   print entry

我发现LDAP模块上的文档非常缺乏(例如,我找不到任何详细说明bind,bind_s,simple_bind和simple_bind_s之间的确切差异的内容,但这是另一天的问题。)。我找不到任何明确表示你需要用whoami_s()或任何东西来完成绑定的东西。我应该接受它,还是应该担心?

Python: 2.6.9
LDAP module: 2.4.13

2 个答案:

答案 0 :(得分:3)

只是通过反复试验来解决这个问题。首先,经过更多搜索,我找到了一个明确说明bind,bind_s,simple_bind和simple_bind_s之间差异的网站:http://www.packtpub.com/article/installing-and-configuring-the-python-ldap-library-and-binding-to-an-ldap-directory

最后没有“s”的方法是异步的 - 无论操作是否完成,代码都会继续。最后带有“s”的方法是同步的 - 代码停止并等待操作完成。

所以我在这里遇到的是一种种族歧视。我用“time.sleep(1)”代替“whoami_s()”,这就解决了问题。这让我意识到我需要从“simple_bind”改为“simple_bind_s”。

,在我被正确绑定之前,我过快地访问了LDAP查询代码

答案 1 :(得分:0)

这很奇怪。在最简单的情况下,客户必须:

  • 连接到服务器。
  • 如果连接成功,请根据需要使用BIND请求更改连接的授权状态(其中有两种,简单和SASL)。
  • 如果BIND成功,则传输其他LDAP请求,例如searchcomparemodifymodify DN等等;解释服务器到达时的响应。 LDAPv3客户端也可以再次BIND,这将改变连接的授权状态。

我不知道whoami_s做了什么(虽然有一个名为WHO AM I的LDAP扩展操作),但没有必要。乍一看,第一个代码示例应该可行。假设连接正常并且BIND成功,那就是所需要的。如果有更多,那么API就会被破坏。

不是答案,对不起。

另见

相关问题