Как узнать правильные параметры ldap

в настоящее время я работаю над небольшим проектом с 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);

Я думаю, что мой код выглядит правильно, или я что-то пропустил? В чем может быть проблема и как я могу это узнать?

6 ответов


значение "data 52e", указанное в ошибке, означает, что привязка не удалась из-за: Возвращает, когда имя пользователя допустимо, но пароль / учетные данные недопустимы.

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


эта проблема также может возникнуть, если полный домен не включен в имя пользователя.

установите Принципал безопасности как 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);

У меня были проблемы с попыткой защитить соединение от wildfly к серверу Microsoft active directory, основная проблема заключается в том, что я не знаю, какая строка подключения должна быть.
Если вы установите "Active Directory Explorer" из Sysinternals взял комплект, предоставленный Microsoft. Поиск объекта, к которому вы хотите привязаться, будет отображаться параметр " путь:". Это строка значений,которые необходимо процитировать в аргументе контексту.SECURITY_PRINCIPAL значение. В моем случае строка пути имела формат

СN=Фред блогов,ОУ=ХХХ пользователи,DC=ФОО-бар в,dc=com,и ХХХ.фу-бар.ком:389 [xxx.foo-bar.com]]

требуемым аргументом будет

"СN=Фред блогов,ОУ=ХХХ пользователи,DC=ФОО-бар в,dc=com"и

Пожалуйста, обратите внимание, что пробелы очень важны


код ошибки LDAP 49 указывает на "недопустимые учетные данные", что означает, что пароль, отправленный на сервер LDAP, был неправильным.


Active Directory: Проверьте контейнеры домена.

у меня была такая же ошибка при миграции из eDirectory в Active Directory, имя пользователя и пароль казались правильными, но по какой-то причине я все еще получал ошибку "52e", которая указывает, что пароль неверен.

мне пришлось добавить DC (контейнеры домена) к принципалу, чтобы заставить его работать:

не работает:

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

добавление DCs: (это сработало для me)

 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, вы узнаете, какие точные параметры вы должны использовать в своем коде.


ldapcontext взаимодействует через DirContext;

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