在我的应用程序中,我正在使用LDAP绑定身份验证机制。即使任何一个不匹配(用户名或密码),我也会收到AuthenticationException。
我想显示用户名不匹配或密码不匹配的错误消息。目前,使用AuthenticationException无法获取正确的详细信息。
现有的API会有帮助吗?或者需要使用API进行查询?
先谢谢。
答案 0 :(得分:0)
如果用户提供用于身份验证的用户名和密码,最好不要告诉他们登录失败的确切原因。您总是告诉他们用户名和密码之间存在不匹配,因此攻击者无法了解是否存在特定的用户名。
答案 1 :(得分:0)
我同意最佳做法不是说出原因。
-
但是,无论如何你都必须这样做:
使用用户名执行search
以检查用户名是否存在。如果它不存在,那就是错误。
如果用户存在并且它继续进行身份验证但您收到AuthenticationException,则说明密码错误。
-
编辑:
If(checkUserExists(username)){
//construct the hashtable environment
//...
ht.put(Context.SECURITY_PRINCIPAL, username);
ht.put(Context.SECURITY_PRINCIPAL, password);
//...
try {
localLdapContent = new InitialLdapContext(ht, null);
} catch (Exception e) {
//suppose it's a wrong password
}
}else{
//error user doesn't exist
}
您需要另一个ldap连接,并且有权检查用户是否有所有请求。
boolean checkUserExists(String username) {
//...
ht_administrator.put(Context.SECURITY_PRINCIPAL, admin_username);
ht_administrator.put(Context.SECURITY_PRINCIPAL, admin_password);
//...
adminconn = new InitialLdapContext(ht_administrator, null);
return adminconn.search(
"uid="+username+",ou=people,dc=example,dc=com", "(objectclass=*)", searchControls
).hasMore();
}
答案 2 :(得分:0)
Microsoft Active Directory中的returned error codes提供该信息。
“例外是[LDAP:错误代码49 - 80090308:LdapErr:DSID-0Cxxxxxx,注释:AcceptSecurityContext错误,数据,vece]。”
数据值将告知问题。