【问题标题】:How to check a username/password combination?如何检查用户名/密码组合?
【发布时间】:2025-12-12 21:45:01
【问题描述】:

使用 LDAP 检查用户名/密码就像尝试绑定该用户并记录结果一样简单,或者是否有特殊的 LDAP“检查密码”功能?

在处理一个凌乱的 LDAP 存储库设置问题时,我试图获得更多“幕后”的理解。

(注意:这是针对密码不作为哈希值存储在自定义属性中的情况;这种情况很容易管理)

【问题讨论】:

    标签: ldap


    【解决方案1】:

    LDAP 支持用户密码的比较。您发送密码,服务器进行比较并返回真或假。这是验证用户身份的不需要登录方式。

    【讨论】:

    • 如果 LDAP 服务器中的密码是加密的,你会如何“比较”?
    • @Ashwinkumar 有一个特定的功能可以进行密码比较。您提供密码进行测试,它同样经过加密,然后您可以比较这两个值。区别在于尝试绑定这些凭据,或显式调用 ldapCompare 函数。
    • hmm.. 在我最近发布的*.com/questions/16168293/… 的一个问题中,有人建议我对带有密码的搜索结果使用绑定。与最新的“dn”作品绑定。但是,绑定本质上是一种“登录”。执行 LDAP 'ldap_compare_s' 失败。与 LDAP 用户的密码相比,有没有办法让我获得密码?
    • 能否请您提供确切的函数名称或代码以显示如何比较密码。我在 javax.naming.ldap.InitialLdapContext 类中找不到这样的方法
    • 这里有更多关于与这个概念相关的规范的信息——tools.ietf.org/id/…。不确定它被广泛采用!
    【解决方案2】:

    查看 WhoAmI 扩展操作 (RFC 4532)。

    WhoAmI 确实有一个目的 - 验证提交的绑定凭据。它不应影响或引发任何“登录限制”(据我所知)。

    WhoAmI 可以使用专用的二进制文件(例如“ldapwhoami”)来完成,或者可以使用 Net::LDAP::Extension::WhoAmI (Perl) 或其他一些支持 LDAP 操作的此类语言来完成。请注意,使用某些“搜索”功能“测试密码”是一种不明智的测试方法。

    例如,如果我的 DN 是“uid=max,ou=users,dc=company,dc=com”并且我的密码是“@secret”,则可以通过 Linux 机器上的专用二进制文件来执行此操作(注意-ZZ 用于 TLS 机密性,在您的环境中可能不支持或可选):

    ldapwhoami -x -w "@secret" -D uid=max,ou=users,dc=company,dc=com -ZZ -H ldap://address.of.your.ldapserver/
    

    如果用户/通行证组合正确,则返回的答案是:

    dn:uid=max,ou=users,dc=company,dc=com

    如果用户/通行证组合不正确,则返回的答案(通常)是:

    (49) 无效凭证

    这可能意味着,正如我所说,密码和/或用户名错误,用户不存在,或者 LDAP 服务器的 ACL 被破坏,无法进行身份验证。通常情况下,用户/通行证组合输入错误,或者用户不存在。

    最后,LDAPWhoAmI 操作是一种非常轻量级且简单的凭据验证方法。它也可以通过其他机制工作(例如:Kerberos Single Sign-On、Digest-MD5 等)。

    【讨论】:

    • 用户名和密码甚至不会作为WhoAmIrequest 的一部分发送。 WhoAmi 操作所做的只是告诉您当前绑定的身份。因此,说它“验证提交的绑定凭据”是无稽之谈。它没有。它只是返回它们,或者只是返回用户名。进行验证的是 bind 步骤:因此它本身就足够了。在给出的示例中,ldapwhoami 首先绑定,可能会失败并显示Invalid Credentials,然后执行WhoAmI 操作。 任何 LDAP 操作都会完成。不一定是WhoAmi
    • 请注意:有很多地方会出错。特别是 MS Active Directory 的默认配置相当草率。示例:ldapwhoami -x -w "" -D <dn> -H <uri> 不会失败,尽管密码为空。所以检查[ "$?" -eq "0" ] 不会成功。 AD 只会返回一个空字符串,因此 ldapwhoami 将退出 0。
    【解决方案3】:

    注意使用 bind 检查用户名/密码,在某些系统上它会被视为一次登录,并且由于登录限制它可能会失败。

    使用比较是检查密码的更好选择。

    【讨论】:

    • 另外,使用空密码登录也算作匿名绑定,这将始终成功。
    • 我猜“正确”的方法取决于你想要做什么。在编写将身份验证委托给外部目录的应用程序的常见情况下,登录限制通常是可取的,不是吗?
    • 我不知道“检查密码”和“登录”之间的区别可能是什么,或者更确切地说,为什么你会想要一个而没有另一个。 @geoffc 匿名绑定只有在服务器配置为允许时才会成功。
    【解决方案4】:

    以该用户身份绑定就足够了。绑定过程中检查密码。

    【讨论】: