【问题标题】:How to find out the right ldap parameters如何找出正确的ldap参数
【发布时间】:2013-05-23 04:50:15
【问题描述】:

我目前正在处理一个使用 Active Directory 和一些 LDAP 东西的小项目... 我尝试连接到 LDAP 服务器,但它总是给我同样的错误:

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

据我所知,这意味着凭据错误,但我 100% 确定它们是正确的! 难道是我忘记了一个参数?

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);

我认为我的代码看起来不错,还是我遗漏了什么?可能是什么问题,我怎样才能找到它?

【问题讨论】:

  • 松饼,我遇到的错误与您完全相同。客户正在输入正确的凭据,并且他们的 DN 看起来不错。在我的测试环境中,我从来没有遇到过这个错误!你的情况是什么?至少,这会给我一些线索。我真的很感谢你的帮助。谢谢。
  • 这是我前段时间遇到的一个错误,但我记得问题不在于凭据...您的问题可能是您在身份验证期间在某处使用了错误的“OU” (例如,“ou=Users”可能不完整,因为您最后忘记添加域或其他内容......)我不会过多关注凭据,它们可能是正确的。而是尝试其他路径(所以所有带有“ou =”的东西),这可能会有所帮助;)
  • 感谢松饼的回复。我会检查任何错误的搜索库。
  • 我有一个与你们相似的错误,我在stackoverflow.com/questions/32166646/… 中提到了它。我通过 JXplorer 连接到 Ldap,所以我确定设置是正确的。但是我无法使用已经在 Ldap 中声明的用户登录到项目,并且我遇到了同样的错误。我如何知道在我的配置中使用正确的“OU”?我想知道你是否可以帮助我。

标签: java url active-directory ldap


【解决方案1】:

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

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

【讨论】:

  • 链接是 404 atm
  • 谢谢。固定链接。
  • 就我而言,我不得不使用domain\user 而不是user,因为我连接到不同的域。
【解决方案2】:

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

将安全主体设置为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);

【讨论】:

  • 谢谢!我刚刚写了一个大问题,准备发布它,并看到这个问题出现在相关问题中。我所缺少的只是“@mydomain.com”。现在可以了 :) 再次感谢您!
【解决方案3】:

我在尝试保护从 wildfly 到 Microsoft 活动目录服务器的连接时遇到问题,主要问题是不知道应该是什么连接字符串。
如果您从 Microsoft 提供的 Sysinternals take kit 安装“Active Directory Explorer”。搜索您要绑定的对象,将显示“路径:”设置。这是您需要在 Context.SECURITY_PRINCIPAL 值的参数中引用的值字符串。 在我的情况下,路径字符串的格式为

CN=Fred Blogs,OU=XXX Users,DC=foo-bar,DC=com,xxx.foo-bar.com:389 [xxx.foo-bar.com]]

所需的参数是

“CN=Fred Blogs,OU=XXX 用户,DC=foo-bar,DC=com”

请注意空格很重要

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • ldap 结果代码“49”表示凭据无效。可以是密码或专有名称。
    【解决方案5】:

    Active Directory:检查您的域容器。

    我在从 eDirectory 迁移到 Active Directory 时遇到了同样的错误,用户名和密码似乎正确,但由于某种原因,我仍然收到“52e”错误,表明密码不正确。

    我必须将 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 命令使其在操作系统中工作,那么您将知道您应该在代码中使用哪些确切参数。

    【讨论】:

      【解决方案6】:

      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();
      

      【讨论】:

      • 经过多次尝试,这段代码有效。关键是你应该理解这些参数,比如searchBase、searchFilter、CN、DC等......
      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2020-05-15
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多