【问题标题】:How to make ldap respect Active Directory password history in php如何使 ldap 尊重 php 中的 Active Directory 密码历史记录
【发布时间】:2012-08-09 18:21:51
【问题描述】:

我有权访问实施 5 个密码历史限制的 Active Directory。您拥有的最后 5 个密码中的任何密码都不适合设置或重置为您的密码。

我正在使用 php 并尝试使用 ldap 调用来重置用户的密码。我可以使用 ldap_modify 调用很好地重置密码。不幸的是,ldap_modify 根本不关心 Active Directory 的密码历史规则,它会将密码重置为您选择的任何内容,而不会出现警告或错误。

有什么办法让 ldap 遵守这个限制?

我已经研究了一段时间,但没有找到任何可靠的解决方案。非常感谢任何提示或 cmets!

【问题讨论】:

    标签: php active-directory passwords ldap


    【解决方案1】:

    最近我遇到了同样的问题,发现this post。显然,密码修改被视为管理密码重置,您必须为 AD 指定其他选项以应用其规则。

    根据帖子,该控件必须在服务器上可用。它存在于 Windows Server 2008 R2 Service Pack 1 中,并且可以使用此修补程序安装在 2008 R2 中:http://support.microsoft.com/?id=2386717

    然后你在对你的 php 代码发出修改命令之前配置选项:

    $ctrl1 = array(
        // LDAP_SERVER_POLICY_HINTS_OID for Windows 2012 and above
        "oid" => "1.2.840.113556.1.4.2239",
        "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 1));
    
    $ctrl2 = array(
        // LDAP_SERVER_POLICY_HINTS_DEPRECATED_OID for Windows 2008 R2 SP1 and above
        "oid" => "1.2.840.113556.1.4.2066",
        "value" => sprintf("%c%c%c%c%c", 48, 3, 2, 1, 1));
    
    if (!ldap_set_option($ds, LDAP_OPT_SERVER_CONTROLS, array($ctrl1, $ctrl2))) {
        error_log("ERROR: Failed to set server controls");
    }
    
    $result = ldap_mod_replace($ds, $dn, $entry);
    

    非常感谢帖子作者 bmaupin(找不到他/她的名字)。 我决定回答这个问题,因为我是在寻找相同问题的解决方案时来到这里的。

    【讨论】:

      【解决方案2】:

      如果 MODIFY 因任何原因失败,目录服务器应在 MODIFY 响应中返回非零结果代码。如果发生属性约束违规(例如,历史中的密码,或自上次密码更改后经过的时间不足,或任何其他属性约束违规),目录服务器必须返回 @987654321 的整数结果代码@ (19)。

      LDAP 协议不知道服务器实现如何处理密码策略。 LDAP 客户端必须使用上述结果代码来确定 LDAP 请求是否成功。也就是说,LDAP 客户端与服务器实现隔离

      用户条目是否受密码策略或任何其他属性约束确定取决于服务器,而不是协议。如果 MODIFY 请求成功,即使客户端预计它会失败,则问题出在服务器端或密码策略的限制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多