【问题标题】:Check credentials against an LDAP server根据 LDAP 服务器检查凭据
【发布时间】:2011-11-28 00:35:29
【问题描述】:

假设一个应用程序可以配置为使用 LDAP 服务器 - 无论是 ActiveDirectory 还是 OpenLDAP 等 - 来验证其用户并检索有关他们的一些附加信息以进行授权。应用程序绑定到 LDAP 服务器的方式也是可配置的 - 它可以使用简单绑定或 SASL 绑定,具体取决于 LDAP 服务器支持的内容和整体安全要求。

假设如果绑定成功使用用户提供的任何凭据,则它必须意味着这些凭据是有效的。但是,情况并非总是如此。即使在实际上预期非空密码的情况下提供了空密码,也可能发生简单绑定成功的情况。根据RFC about LDAP authentication methods,使用非空用户名和空密码的简单绑定被解释为意图建立未经身份验证的连接,并具有匿名授权。可以将服务器配置为使用 unwillingToPerform 使此类尝试失败,但它也可以允许它们。

问题是:在这种情况下,可以将应用程序配置为使用各种 LDAP 服务器,并以可配置的方式(简单或通过 SASL)进行绑定——有没有办法明确检查用户输入的凭据考虑到一个简单的绑定可能导致误报,而不是尝试与这些凭据绑定,而不是针对该特定 LDAP 服务器?

谢谢您,期待您的回复。

【问题讨论】:

    标签: ldap


    【解决方案1】:

    当然,您所要做的就是禁止,或者甚至只是记住密码为空的情况?

    【讨论】:

    • 确实,一种可能性是禁止预先提供空密码。但是,我试图找出是否有其他方法可以解决这个问题。
    • @Catalina Caloian '或者只是记住'。有3例。 1. 服务器不允许没有密码的简单身份验证:问题消失了。 2. 用户未输入密码且用户有密码:没问题;这就是您要确定的情况。 3. 用户没有密码 => 这不是你的问题,这是一个不安全的服务器;无法检查凭据,因为没有要检查的凭据。
    • 我尝试使用ldap_compare 将“userPassword”的值与用户提供的值进行比较,如here 所示。但是,它似乎不适用于 ActiveDirectory,这是一个表演障碍。最后,我添加了一个不允许空密码的设置。
    【解决方案2】:

    至少在 PHP 中,您只需要这样做:

    <?php
    $ds = ldap_connect($ip_address);
    if(@ldap_bind($ds, $username, $password) {
      // Login successful!
    } else {
      // Login unsuccessful :(
    }
    ?>
    

    您的里程可能因其他语言而异,但这对我有用。

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 2012-11-13
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多