我正在尝试使用OpenLDAP密码策略进行身份验证。
我已将ppolicy设置如下:
dn: cn=passwordDefault,ou=Policies,dc=company,dc=com objectClass: pwdPolicy objectClass: person objectClass: top cn: passwordDefault sn: passwordDefault pwdAttribute: userPassword pwdCheckQuality: 0 pwdMinAge: 0 pwdMaxAge: 7776000 pwdMinLength: 8 pwdInHistory: 5 pwdMaxFailure: 5 pwdFailureCountInterval: 600 pwdLockout: TRUE pwdLockoutDuration: 0 pwdAllowUserChange: TRUE pwdExpireWarning: 604800 pwdGraceAuthNLimit: 0 pwdMustChange: FALSE pwdSafeModify: FALSE
在测试策略时,如果密码已过期,我只能收到警告:
try { bindResult = bind(ldapConnection, userDN, userPassword); } catch (LDAPException le) { bindResult = new BindResult(le.toLDAPResult()); } DraftBeheraLDAPPasswordPolicy10ResponseControl pwpResponse = DraftBeheraLDAPPasswordPolicy10ResponseControl.get(bindResult); DraftBeheraLDAPPasswordPolicy10WarningType warningType = pwpResponse.getWarningType();
警告类型不为null的唯一时间是密码到期时。
当帐户在5次尝试失败后被锁定时,ldap会返回"错误的凭据",但那不是真的。
如何获得身份验证失败的正确原因?
感谢。
答案 0 :(得分:2)
当您获得异常时,您仍然可以拥有响应控件。我不知道在Spring-LDAP中看起来像什么,但我已经通过LdapContext.getResponseControls()
在JNDI中完成了它。响应控件应包含锁定状态。
但是你需要注意这一点。您不希望向用户披露该帐户已被锁定。这将是表面上的安全漏洞。您将向攻击者透露该帐户是否存在,并且进一步的立即尝试将不会成功,这两者都有助于他的工作。