【问题标题】:Python LDAP and Active Directory issuePython LDAP 和 Active Directory 问题
【发布时间】:2012-02-25 05:36:13
【问题描述】:

我会尝试包含尽可能多的细节,但考虑一下这种情况:

出于隐私方面的考虑,假设我有一个如下所示的 Active Directory 基础架构:

microsoft.com
和一些子域:
csharp.microsoft.com
vb.microsoft.com

所有用户帐户都存储在 microsoft.com。

我从以下代码开始:

import ldap
ldap.set_option(ldap.OPT_REFERRALS,0)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)

(我知道我可能应该拥有该域的证书,但你能做什么)

然后我建立如下连接:

conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")

在我的脚本中,我正在搜索用户帐户,并使用以下搜索:

result_id = conn.search("DC=microsoft,DC=com",
                                ldap.SCOPE_SUBTREE,
                                "(&(CN=gates)(!(objectClass=contact)))",
                                None)
result_type,result_data = conn.result(result_id,0)

好的,所以这很有效....大部分时间。
当它起作用时,我会得到以下效果:

[("CN=gates,OU=Users,DC=microsoft,DC=com", {'sAMAccountName':['gates']}])

但是,我似乎随机得到如下结果:

[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]

虽然结果有意义 - csharp.microsoft.com 中不存在门,但在 microsoft.com DC 中存在 - 它仍然非常令人费解,因为我的印象是使用 OPT_REFERRALS 设置为 0 会告诉 Python LDAP 模块不使用推荐。 为了让事情变得更有趣,我有时也会得到如下结果:

[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]

所以我的问题 - 我做错了什么吗?

另外,有人建议,如果我使用“OU=Users,DC=microsoft,DC=com”之类的搜索路径,而不是仅从根目录(“DC=microsoft,DC=com”)搜索, LDAP 客户端模块不会尝试使用引用 - 这准确吗?

编辑

这个问题与 LDAP 无关,而是 WSGI 配置错误。 使用 WSGIDaemonProcess 解决了我们遇到的交叉污染问题。

【问题讨论】:

    标签: python active-directory


    【解决方案1】:

    将 ldap.OPT_REFERRALS 设置为 0 告诉服务器不要“追逐”引用,即不解决它们。

    以 None 作为第一个元素的结果是服务器告诉您“这是推荐,但您告诉我不要追究它”的方式。至少这是我的理解。

    如果您不想要推荐,只需忽略第一个元素为 None 的结果。

    【讨论】:

    • 这是我在不同文章中读到的,然而,似乎只有一个回复——推荐。其中,如果我忽略了那个结果,那么自然不会有结果。也许,我使用了错误的方法?
    • 您要连接的服务器上是否有负载均衡器?也许这可能是问题所在。
    • 涉及到一个负载平衡器,但它不应该影响 LDAP 系统,因为它旨在实现两个 LAMP 服务器之间的负载平衡。 LDAP 查询可能来自这两个 LAMP 服务器之一到两个 AD 服务器之一(两个 AD 服务器每个都有 Microsoft.com 的 A 记录)。
    • 你能直接连接到两个 LAMP 服务器而不是通过负载均衡器吗?如果是这样,请在两台服务器上尝试您的代码,看看您会得到什么结果。 (我怀疑其中一台服务器正在返回“好”结果,而另一台服务器正在返回推荐。)
    • 经过大约一周的调试 - 我们发现了一个问题,这可能是问题所在。这些 LDAP 调用来自使用 WSGI 的 Django 应用程序。经过一些头发拉动调试 - 看起来我们正在经历环境变量的交叉污染。 LDAP 连接凭证和搜索路径存储在环境变量中。当我获得更多信息时,我会更新我原来的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多