Java LDAP AD

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:

[code]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());
	}
}

}[/code]

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 …

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.

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

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  

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:

[code]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);
}

}[/code]

[code]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);
        }
    }
}

}[/code]

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 ?

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.

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:

[code]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() );
	}
}

}[/code]

Obrigado pela ajuda …

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

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