LDAP / AD - 如何确定用户名或密码是否不匹配

时间:2017-02-13 12:00:56

标签: java active-directory ldap java-security


在我的应用程序中,我正在使用LDAP绑定身份验证机制。即使任何一个不匹配(用户名或密码),我也会收到AuthenticationException。
       我想显示用户名不匹配或密码不匹配的错误消息。目前,使用AuthenticationException无法获取正确的详细信息。

现有的API会有帮助吗?或者需要使用API​​进行查询?

先谢谢。

3 个答案:

答案 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]。”

数据值将告知问题。