LDAP身份验证查询

时间:2012-12-24 05:46:13

标签: java ldap

  1. 我在Java LDAP身份验证(AD)中遇到问题。我不明白这种LDAP身份验证是如何发生的
  2. 在代码下面,他们尝试使用用户名和密码获取带有用户名和密码的LDAP服务器的所有详细信息的InitialDirContext,如果它引发了基于其确定返回代码的异常。

    private void doSimpleAuthentication() {
            try {
                String hostURL = "ldap://" + hostName + ":" + port + "/";
                env.put(Context.PROVIDER_URL, hostURL);
                env.put(Context.SECURITY_AUTHENTICATION, "simple");
    
                String principal = userName + "@" + domain;
    
                // First connect to LDAP Server using Directory Manager credentials
    
                DirContext ctx = connectToDirServer(principal, password);
                returnCode = VALID_USER;
    
                if (warningPeriod >= 0) {
                    String filter = "(sAMAccountName=" + userName + ")";
                    SearchControls ctrl = new SearchControls();
                    ctrl.setSearchScope(SearchControls.SUBTREE_SCOPE);
                    NamingEnumeration results = ctx.search(baseDn, filter, ctrl);
    
                    if (results != null && results.hasMoreElements()) {
                        SearchResult result = (SearchResult) results.next();
                        String attPrincipal = (result).getName() + "," + baseDn;
    
                        if ((!isPwdNeverExpires(result)) && isPasswordNearingExpiry(ctx, attPrincipal)) {
                            returnCode = PASSWORD_NEARING_EXPIRY;
                        }
                    }
                }
                if (ctx != null) ctx.close();
            } catch (CommunicationException e) {
                errorMessage = e.getMessage();
                errorStackTrace = AgsUtil.convertToString(e);
                returnCode = SERVER_NOT_AVAILABLE;
            } catch (Exception e) {
                errorMessage = e.getMessage();
                errorStackTrace = AgsUtil.convertToString(e);
                returnCode = UNKNOWN_ERROR;
                if (errorMessage.indexOf("525") != -1 || errorMessage.indexOf("successful bind must be completed") != -1) {
                    returnCode = USER_NOT_FOUND;
                } else if (errorMessage.indexOf("52e") != -1) {
                    returnCode = INVALID_PASSWORD;
                } else if (errorMessage.indexOf("701") != -1 || errorMessage.indexOf("532") != -1 || errorMessage.indexOf("773") != -1) {
                    returnCode = PASSWORD_EXPIRED;
                } else if (errorMessage.indexOf("533") != -1) {
                    returnCode = USER_DISABLED;
                } else if (errorMessage.indexOf("775") != -1) {
                    returnCode = USER_LOCKOUT;
                } else if (errorMessage.indexOf("530") != -1) {
                    returnCode = LOGON_DENIED_AT_THIS_TIME;
                }
            }
        }
    public DirContext connectToDirServer(String distinguishedName, String password) throws Exception {
            env.put(Context.SECURITY_PRINCIPAL, distinguishedName);
            env.put(Context.SECURITY_CREDENTIALS, password);
            return new InitialDirContext(env);
        }
    

    2.我遇到的问题是客户所在地如果在LDAP(AD)中找不到用户,则返回状态代码为“INVALID_USERID_PASSWORD”而不是“USER_NOT_FOUND”。客户问我要提供以下信息

    针对ldap服务器的应用程序的查询或其他术语,作为ldap查询传递的请求字符串是什么。 请参阅下面有关LDAP查询的一些信息。

    您可以在这里参考一个样本的参考链接..

    http://www.google.com/support/enterprise/static/postini/docs/admin/en/dss_admin/prep_ldap.html

    如何继续,我找不到有关如何使用这些查询的任何信息。用上面的代码。

2 个答案:

答案 0 :(得分:3)

当BIND请求中的条目不存在时,LDAP目录服务器可能会使用invalid password的结果代码进行响应。它可以防止攻击者知道某个条目是否存在。

答案 1 :(得分:1)

您可能需要以拥有权利的人身份绑定。

我们在LDAP Wiki上有一个示例。