如何在php中使ldap尊重Active Directory密码历史记录

时间:2012-08-09 18:21:52

标签: php active-directory passwords ldap

我可以访问强制执行5密码历史记录限制的Active Directory。您拥有的最后5个密码中的任何密码都不是设置或重置为密码的可行候选者。

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

有没有办法让ldap尊重这个限制?

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

2 个答案:

答案 0 :(得分:2)

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

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

然后在php代码上发出modify命令之前配置选项:

$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(找不到他/她的名字)。 我决定回答这个问题,因为我在寻找同样问题的解决方案时来到这里。

答案 1 :(得分:1)

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

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

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