Java LDAP AD

9 respostas
S

Boa tarde Buddies

Estou fazendo uma classe para conectar e listar dados do meu Active Directory porem estou me deparando com um erro:

[LDAP: error code 49 - 8009030C: LdapErr: DSID-0C09043E, comment: AcceptSecurityContext error, data 0, vece

Segue minha classe:

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class SimpleLDAPClient {
	
	public static void main(String[] args) {
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.PROVIDER_URL, "ldap://190.1.1.1:389");
		env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 GSSAPI");
		env.put(Context.SECURITY_PRINCIPAL, "CN=Silvio,OU=Inf,O=int.novamerica.com.br");
		env.put(Context.SECURITY_CREDENTIALS, "123");
		DirContext ctx = null;
		NamingEnumeration results = null;
		try {
			ctx = new InitialDirContext(env);
		} catch (NamingException e) {
			System.out.println(e.getMessage());
		}
	}

}

Obs.: quando eu me conecto pelo windows utilizando o ldp.exe
ele mostra: supportedSASLMechanisms: GSSAPI; GSS-SPNEGO; EXTERNAL; DIGEST-MD5;

Se alguem puder me ajudar fico grato ...

9 Respostas

R

O DN do seu usuário de conexão está errado, tá faltando um ‘U’:

CN=Silvio,OU=Inf,OU=int.novamerica.com.br

E certifique-se que é este o caminho que está o usuário mesmo. E que ele tem privilégios para a listagem.

S

Ola Rafael Nunes, fiz o teste como sugerido, porem o erro continua.

Novamente acessado pelo programa ldp,exe do windows eu consigo visualizar que meu usuário esta em: CN=Silvio,OU=Inf,DC=int,DC=novamerica,DC=com,DC=br
e tem permissões para conectar

Quem puder me ajudar, fico grato

F

Cara tem uma bibliotequinha ai show de bola que é o JLDAP, ela é exelente para fazer comunicação com o servidor LDAP, pelo menos com o Apache Directory Server funciona sem problemas :slight_smile:

Qualquer coisa experimente assim, segundo o padrão LDAP v3, é assim que se define o caminho completo do servidor LDAP, mas a M$ não é muito xega em padrões :slight_smile:

CN=Silvio,OU=Inf,OU=int,ou=novamerica,ou=com,ou=br

ou

CN=Silvio,OU=Inf,DC=int,DC=novamerica,DC=com,DC=br
S

Ola Felagund, fiz como sugerido e também não deu certo:

env.put(Context.SECURITY_PRINCIPAL, "CN=Silvio,OU=Inf,OU=int,ou=novamerica,ou=com,ou=br");
env.put(Context.SECURITY_PRINCIPAL, "CN=Silvio,OU=Inf,DC=int,DC=novamerica,DC=com,DC=br");

Fiz uma pesquisa sobre a biblioteca sugerida JLDAP e encontrei o site http://developer.novell.com/documentation/samplecode/jldap_sample/index.htm

Fiz o seguinte exemplo:

import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;
import java.security.Security;

public class MD5Bind {

    public static void main( String[] args ) {
        String ldapHost = "190.1.1.1";
        int ldapPort = 389;
        //String loginDN = "cn=Silvio,ou=Inf,o=int.novamerica.com.br";
        //String loginDN = "cn=Silvio,o=int.novamerica.com.br";
        //String loginDN = "CN=Silvio,OU=Inf,OU=int,ou=novamerica,ou=com,ou=br";
        String loginDN = "CN=Silvio,OU=Inf,DC=int,DC=novamerica,DC=com,DC=br";
        //String loginDN = "cn=Administrator,ou=Users,o=int.novamerica.com.br";
        //String loginDN = "cn=Administrator,o=int.novamerica.com.br";
        //String loginDN = "CN=Administrator,OU=Users,OU=int,ou=novamerica,ou=com,ou=br";
        //String loginDN = "CN=Administrator,OU=Users,DC=int,DC=novamerica,DC=com,DC=br";        
        final String password = "123";
        String[] mechanisms = {"DIGEST-MD5"};       
        LDAPConnection lc = new LDAPConnection();
        try {
        	Security.addProvider(new com.novell.sasl.client.SaslProvider());
        } catch(Exception e) {
           System.err.println("Error loading security provider ("+e.getMessage()+")"); 
        } 
        try {
        	lc.connect(ldapHost, ldapPort);
            lc.bind(loginDN,"dn: "+loginDN, mechanisms, null, new BindCallbackHandler(password));
            System.out.println("Digest-MD5 Sasl bind was successful.");
            lc.disconnect();
        } catch(LDAPException e) {
            System.err.println("MD5Bind example failed");
            System.err.println( "Error: " + e.toString() );
            System.exit(1);
        }
        System.exit(0);
    }

}
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import com.novell.security.sasl.RealmCallback;
import com.novell.security.sasl.RealmChoiceCallback;
import java.io.IOException;

class BindCallbackHandler implements CallbackHandler{

    private char[] m_password;

    BindCallbackHandler(String  password) {
        m_password = new char[password.length()];
        password.getChars(0, password.length(), m_password, 0);
    }

    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for (int i=0; i<callbacks.length; i++) {
            if (callbacks[i] instanceof PasswordCallback) {
                ((PasswordCallback)callbacks[i]).setPassword(m_password);
            } else if (callbacks[i] instanceof NameCallback) {
                ((NameCallback)callbacks[i]).setName(((NameCallback)callbacks[i]).getDefaultName());
            } else if(callbacks[i] instanceof RealmCallback) {
                ((RealmCallback)callbacks[i]).setText(((RealmCallback)callbacks[i]).getDefaultText());
            } else if (callbacks[i] instanceof RealmChoiceCallback) {
                ((RealmChoiceCallback)callbacks[i]).setSelectedIndex(0);
            }
        }
    }

}

Tentei com todos os loginDN acima e ocorre o seguinte erro:

MD5Bind example failed
Error: LDAPException: Invalid Credentials (49) Invalid Credentials
LDAPException: Server Message: 8009030C: LdapErr: DSID-0C09043E, comment: AcceptSecurityContext error, data 0, vece

Alguem tem alguma ideia ?

R

O seu problema está com o usuário (Context.SECURITY_PRINCIPAL) e/ou com a senha(Context.SECURITY_CREDENTIALS). Confirme no AD se são estas as informações.

S

Aeh Buddies ... consigo um exemplo muito bom em: http://developer.novell.com/documentation/samplecode/jldap_sample/index.htm

Segue minha classe ja adaptada para as minhas necessidades:

package br.com.silviocandido.ldap.search;

import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPSearchResults;
import com.novell.ldap.util.Base64;

public class Pesquisa {
	
    @SuppressWarnings("unchecked")
	public static void main(String[] args) {
    	// --> dados do servidor e usuário
        int ldapVersion = LDAPConnection.LDAP_V3;
        int ldapPort = LDAPConnection.DEFAULT_PORT;
        String ldapHost = "190.1.1.1";
        String loginDN = "CN=Silvio,OU=Inf,DC=int,DC=novamerica,DC=com,DC=br";
        String password = "123";
        
        // --> conectar no banco
        LDAPConnection conn = new LDAPConnection();
		try {
			conn.connect(ldapHost, ldapPort);
			conn.bind(ldapVersion, loginDN, password.getBytes("UTF8"));
        } catch (LDAPException e) {
        	e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		// --> realiza a pesquisa
		try {
			LDAPSearchResults searchResults = 
                	 conn.search("OU=Supt,DC=int,DC=novamerica,DC=com,DC=br",
                			 LDAPConnection.SCOPE_ONE,
                			 "(objectclass=user)",
                			 null,
                			 false);
            while (searchResults.hasMore()) {
            	LDAPEntry nextEntry = null;
                try {
                	nextEntry = searchResults.next();
                } catch(LDAPException e) {
                	System.out.println("Error: " + e.toString());
                	if (e.getResultCode() == LDAPException.LDAP_TIMEOUT || e.getResultCode() == LDAPException.CONNECT_ERROR)
                		break;
                	else
                		continue;
                }
                System.out.println("DN -> "+nextEntry.getDN());

                LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
                Iterator allAttributes = attributeSet.iterator();
                while (allAttributes.hasNext()) {
                	LDAPAttribute attribute = (LDAPAttribute)allAttributes.next();
                    String attributeName = attribute.getName();
                    Enumeration allValues = attribute.getStringValues();
                    if (allValues != null) {
                    	while (allValues.hasMoreElements()) {
                    		String Value = (String) allValues.nextElement();
                            if (Base64.isLDIFSafe(Value)) {
                                System.out.println(attributeName +" -> "+ Value);
                            } else {
                            	Value = Base64.encode(Value.getBytes());
                            	System.out.println(attributeName +" -> "+ Value);
                            }
                    	}
                    }
                }
                System.out.println("\n");
            }
            
            // --> Desconecta
            conn.disconnect();
		} catch( LDAPException e ) {
			System.out.println( "Error: " + e.toString() );
		}
    }

}
S

Obrigado pela ajuda …

F

err… Funcionou? eu sou fão do JLDAP funciona muito bem :slight_smile:

G

Brother, isso lista todos os usuarios que contem no AD? listou apenas dois… como faço para listar todos?

Criado 30 de março de 2009
Ultima resposta 12 de nov. de 2013
Respostas 9
Participantes 4