【问题标题】:LDAP/AD - How to determine whether user name or password is mismatchLDAP/AD - 如何确定用户名或密码是否不匹配
【发布时间】:2017-02-13 12:00:56
【问题描述】:


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

是否有任何现有的 API 可以提供帮助?还是需要使用API​​查询?

提前致谢。

【问题讨论】:

    标签: java active-directory ldap java-security


    【解决方案1】:

    如果用户提供用户名和密码进行身份验证,最好不要告诉他们登录失败的确切原因。你总是告诉他们用户名和密码不匹配,所以攻击者不会知道特定用户名是否存在。

    【讨论】:

    • 我没有在 UI 中显示哪一个错误,但我的代码需要了解哪一个与用户名或密码不匹配
    【解决方案2】:

    来自 Microsoft Active Directory 的 returned error codes 提供了该信息。

    “例外是 [LDAP: 错误代码 49 - 80090308: LdapErr: DSID-0Cxxxxxx, comment: AcceptSecurityContext error, data , vece]。”

    数据值将告知问题。

    【讨论】:

    • 对于用户名和密码不匹配,我收到相同的错误消息“javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece"
    • 有什么方法可以在不提供密码的情况下查询用户id是否存在(握手ldap服务器)?
    【解决方案3】:

    我同意最好的做法是不要说出原因。

    --

    但如果你必须这样做,无论如何:

    使用用户名执行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();
    }
    

    【讨论】:

    • 我没有全局上下文。是否可以在不提供密码的情况下查询用户ID是否存在(握手ldap服务器)?
    • 您可以简单地使用管理员用户名和密码实例化new InitialLdapContext 进行搜索。
    • 这就像使用管理员帐户(或任何具有足够权限的帐户)查询任何用户一样。
    猜你喜欢
    • 2016-09-08
    • 2019-10-02
    • 1970-01-01
    • 2014-05-20
    • 2015-12-06
    • 2011-10-21
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多