我已经build立了一个LDAP服务器与ppolicy覆盖,但现在有麻烦重置用户的密码在某些情况下:如果用户login失败,则pwdFailureTime属性存在和ldapmodify失败,抱怨它没有。
如果我最近的login尝试成功,那么我可以绑定为cn = admin并运行ldif文件:
dn: uid=anton,ou=accounts,dc=[redacted],dc=ca changetype: modify replace: userPassword userPassword: foobar - replace: pwdReset pwdReset: TRUE
哪个成功 但是,如果最后一次login尝试的密码错误,ppolicy会为该帐户添加一个pwdFailureTime属性,然后尝试运行上面的ldif文件,结果如下:
$ ldapmodify -x -D "cn=admin,dc=[redacted],dc=ca" -W -H ldap:// -f pwreset.ldif Enter LDAP Password: modifying entry "uid=anton,ou=accounts,dc=[redacted],dc=ca" ldap_modify: No such attribute (16) additional info: modify/delete: pwdFailureTime: no such attribute
如果我在重置密码之前尝试删除pwdFailureTime属性,那么我得到:
ldap_modify: Constraint violation (19) additional info: pwdFailureTime: no user modification allowed
在现实生活中,如果用户忘记了自己的密码并且需要重置密码,他们一般都会尝试多次重新调用密码,因此会设置pwdFailureTime属性。 有什么build议么?
至于IETF的草案 :
8.2.7。 策略状态更新
如果这些步骤已经完成而没有导致错误情况,则服务器将执行以下步骤以更新必要的密码策略状态属性:
如果pwdMaxAge或pwdMinAge的值不为零,则服务器将条目上的pwdChangedTime属性更新为当前时间。
如果pwdInHistory的值不为零,则服务器将先前的密码(如果存在)添加到pwdHistory属性。 如果pwdHistory属性中保存的属性数量超过pwdInHistory的值,则服务器将删除最旧的超额密码。
如果pwdMustChange的值为TRUE且修改由密码pipe理员执行,则pwdReset属性设置为TRUE。 否则,pwdReset将从用户条目中删除(如果存在)。
如果pwdFailureTime和pwdGraceUseTime属性存在,则将其从用户条目中删除。
如果我没有弄错,LDIF是primefaces操作,所以当userPassword被修改时,它链接到删除pwdFailureTime属性,因此当pwdReset的修改似乎也触发了pwdFailureTime的删除失败。
为什么你需要将pwdReset设置为TRUE ? 你已经重置了它。 如果要确保用户在第一次连接时必须“重设”自己的密码:
可能会尝试改为将pwsMustChange属性修改为TRUE ,这应该将pwdReset属性设置为TRUE (根据基于OpenLDAP ppolicy的IETF)
或者可能只是切换在LDIF上的两个修改可以做的伎俩。