2016-08-27 33 views
10

Próbuję uwierzytelniać użytkowników z LDAP przy użyciu konta usługi. Dostaję poniżej błędu na ctx = new InitialDirContext (env);Uwierzytelnianie LDAP przy użyciu konta usługi w języku Java

[LDAP: kod błędu 49 - 8009030C: LdapErr: DSID-0C0903A8, komentarz: error AcceptSecurityContext, dane 2030, v1db1

Czy ktoś może mi pomóc zrozumieć, gdzie będę źle ?

To jest mój plik java

/** 
* 
*/ 
package com.dei; 

import java.util.Hashtable; 

import javax.naming.AuthenticationException; 
import javax.naming.Context; 
import javax.naming.NameNotFoundException; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.SizeLimitExceededException; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 

public class LdapConnector { 


     private static final String LDAP_SERVER_PORT = "389"; 
     private static final String LDAP_SERVER = "server"; 
     private static final String LDAP_BASE_DN = "OU=role,OU=roles,OU=de,OU=apps,DC=meta,DC=company,DC=com"; 
     private static final String LDAP_BIND_DN = "cn=service_account";//service account userid provided by LDAP team 
     private static final String LDAP_BIND_PASSWORD = "password";///service account pwd provided by LDAP team 


     public Boolean validateLogin(String userName, String userPassword) { 
      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://" + LDAP_SERVER + ":" + LDAP_SERVER_PORT + "/" + LDAP_BASE_DN); 

      // To get rid of the PartialResultException when using Active Directory 
      env.put(Context.REFERRAL, "follow"); 

      // Needed for the Bind (User Authorized to Query the LDAP server) 
      env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
      env.put(Context.SECURITY_PRINCIPAL, LDAP_BIND_DN); 
      env.put(Context.SECURITY_CREDENTIALS, LDAP_BIND_PASSWORD); 

      DirContext ctx; 
      try { 
       ctx = new InitialDirContext(env); 
      } catch (NamingException e) { 
       throw new RuntimeException(e); 
      } 

      NamingEnumeration<SearchResult> results = null; 

      try { 
       SearchControls controls = new SearchControls(); 
       controls.setSearchScope(SearchControls.SUBTREE_SCOPE); // Search Entire Subtree 
       controls.setCountLimit(1); //Sets the maximum number of entries to be returned as a result of the search 
       controls.setTimeLimit(5000); // Sets the time limit of these SearchControls in milliseconds 

       String searchString = "(&(objectCategory=user)(sAMAccountName=" + userName + "))"; 

       results = ctx.search("", searchString, controls); 

       if (results.hasMore()) { 

        SearchResult result = (SearchResult) results.next(); 
        Attributes attrs = result.getAttributes(); 
        Attribute dnAttr = attrs.get("distinguishedName"); 
        String dn = (String) dnAttr.get(); 

        // User Exists, Validate the Password 

        env.put(Context.SECURITY_PRINCIPAL, dn); 
        env.put(Context.SECURITY_CREDENTIALS, userPassword); 

        new InitialDirContext(env); // Exception will be thrown on Invalid case 
        System.out.println("Login successful"); 
        return true; 
       } 
       else 
        return false; 

      } catch (AuthenticationException e) { // Invalid Login 
       System.out.println("Login failed" +e.getMessage()); 

       return false; 
      } catch (NameNotFoundException e) { // The base context was not found. 
       System.out.println("Login failed" +e.getMessage()); 
       return false; 
      } catch (SizeLimitExceededException e) { 
       throw new RuntimeException("LDAP Query Limit Exceeded, adjust the query to bring back less records", e); 
      } catch (NamingException e) { 
       throw new RuntimeException(e); 
      } finally { 

       if (results != null) { 
        try { results.close(); } catch (Exception e) { /* Do Nothing */ } 
       } 

       if (ctx != null) { 
        try { ctx.close(); } catch (Exception e) { /* Do Nothing */ } 
       } 
      } 
     } 
} 

Odpowiedz

3

Błąd 49 oznacza nieprawidłowych poświadczeń, ale łańcuch diagnostyczny "AcceptSecurityContext błędach, danych 2030", czyli "Nie ma takiego obiektu", czyli LDAP_BIND_DN „CN = service_account "nie można znaleźć w katalogu. Domyślam się, że "cn = service_account" nie jest pełną nazwą DN konta.

+0

Myślę, że mamy tu błąd drukarski. "Mój gość" prawdopodobnie miał na myśli "Domyślam się" –

+0

Dzięki Vladislav, poprawione :) –

2

Operacja powiązania nie powiodła się, zwykle z powodu problemu z kontem.

Upewnij się, że poświadczenia konta powiązania używanego do łączenia się z serwerem LDAP są poprawne. Dane kodu błędu 2030 oznaczają, że nazwa DN użytkownika jest nieprawidłowa.