如何找出合适的ldap参数

时间:2013-05-28 09:17:17

标签: java url active-directory ldap

我目前正在开发一个包含Active Directory和一些LDAP内容的小项目...... 我尝试连接到LDAP服务器,它总是给我同样的错误:

[LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1

据我所知,这意味着凭证是错误的,但我百分百肯定他们是对的! 可能是我忘记了参数吗?

Hashtable<String, String> env = new Hashtable<String, String>();

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://libertycity.ch:389/dc=libertycity,dc=ch");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_CREDENTIALS, password);
env.put(Context.SECURITY_PRINCIPAL, "uid=" + username + ",ou=Users");
env.put("java.naming.ldap.attributes.binary", "objectSID");

DirContext ctx = new InitialDirContext(env);

我认为我的代码看起来不错,或者我错过了什么?可能是什么问题,我怎么能找到它?

6 个答案:

答案 0 :(得分:17)

错误中提供的值“data 52e”表示绑定失败,原因如下: 当用户名有效但密码/凭证无效时返回。

http://ldapwiki.com/wiki/Common%20Active%20Directory%20Bind%20Errors

答案 1 :(得分:10)

如果用户名中未包含完整域,则也可能出现此问题。

将安全主体设置为username@domain

InitialLdapContext ldapContext = new InitialLdapContext();
ldapContext.addToEnvironment(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldapContext.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
ldapContext.addToEnvironment(Context.SECURITY_PRINCIPAL, userId + "@mydomain.com");
ldapContext.addToEnvironment(Context.SECURITY_CREDENTIALS, password);                  
ldapContext.addToEnvironment(Context.PROVIDER_URL, "ldap://" + ldapHost + ":" + ldapPort);

答案 2 :(得分:2)

我遇到了尝试保护从wildfly到Microsoft Active Directory服务器的连接的问题,主要问题是不知道连接字符串应该是什么。
如果您安装了“Active Directory资源管理器”&#39;来自Sysinternals的软件包由微软提供。搜索您要绑定的对象,路径:&#39;将显示设置。这是您需要在Context.SECURITY_PRINCIPAL值的参数中引用的值字符串。 在我的例子中,路径字符串的格式为

  

CN = Fred博客,OU = XXX用户,DC = foo-bar,DC = com,xxx.foo-bar.com:389 [xxx.foo-bar.com]]

必需的参数是

&#34; CN = Fred博客,OU = XXX用户,DC = foo-bar,DC = com&#34;

请注意,空格非常重要

答案 3 :(得分:1)

LDAP错误代码49表示“凭据无效”,这意味着您发送到LDAP服务器的密码不正确。

答案 4 :(得分:1)

Active Directory:检查您的域容器。

我在从eDirectory迁移到Active Directory时遇到了同样的错误,用户名和密码似乎是正确的但是出于某种原因我仍然得到了#34; 52e&#34;错误,表示密码不正确。

我必须将DC(域容器)添加到主体中才能使其工作:

这不起作用:

env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC");

添加DC :(这对我有用)

 env.put(Context.SECURITY_PRINCIPAL, "CN="+username+",OU=Users,OU=Org,OU=ETC,DC=yourorg,DC=com");

这解决了Active Directory的问题。

真正帮助我解决此问题的方法是尝试使用linux ldapbind / ldapsearch命令https://docs.oracle.com/cd/B10501_01/network.920/a96579/comtools.htm进行绑定。

如果您使用ldapbind / ldapsearch命令从操作系统开始工作,那么您将知道应在代码中使用哪些确切参数。

答案 5 :(得分:0)

DirContext ldapContext;

    Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
      ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
      //ldapEnv.put(Context.PROVIDER_URL,  "ldap://societe.fr:389");
      ldapEnv.put(Context.PROVIDER_URL,  "ldap://10.112.115.14:389");
      ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
      ldapEnv.put(Context.SECURITY_PRINCIPAL, "vmware-china@viewconnection.com");
      ldapEnv.put(Context.SECURITY_CREDENTIALS, "ca$hc0w");
      //ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
      //ldapEnv.put(Context.SECURITY_PROTOCOL, "simple");
      ldapContext = new InitialDirContext(ldapEnv);

      System.out.println(ldapContext);

      // Create the search controls         
      SearchControls searchCtls = new SearchControls();

      //Specify the attributes to return
      String returnedAtts[]={"sn","givenName", "samAccountName", "mail"};
      searchCtls.setReturningAttributes(returnedAtts);

      //Specify the search scope
      searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);

      //specify the LDAP search filter
      String searchFilter = "(&(objectClass=user)(mail=*))";

      //Specify the Base for the search
      String searchBase = "DC=VIEWCONNECTION, DC=COM";
      //initialize counter to total the results
      int totalResults = 0;

   // Search for objects using the filter
      NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls);

    //Loop through the search results
      while (answer.hasMoreElements())
      {
        SearchResult sr = (SearchResult)answer.next();

        totalResults++;

        System.out.println(">>>" + sr.getName());
        Attributes attrs = sr.getAttributes();
        System.out.println(">>>>>>" + attrs.get("samAccountName"));
      }

      System.out.println("Total results: " + totalResults);
      ldapContext.close();