我正在尝试使用OpenLDAP密码策略进行身份验证。
我已经将我的策略设置为以下内容:
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 会返回"错误的凭据",但事实并非如此。
如何获取身份验证失败的正确原因?
谢谢。
当您遇到异常时,您仍然可以使用响应控件。我不知道在 Spring-LDAP 中是什么样子的,但我通过 LdapContext.getResponseControls()
在 JNDI 中完成了。响应控件应包含锁定状态。
但是,您需要小心这一点。您不希望向用户透露帐户已锁定。这将是一个初步的安全漏洞。您将向攻击者透露该帐户存在,并且进一步的即时尝试不会成功,这两者都有助于他的工作。