Estou desenvolvendo uma aplicação que esta se autenticando numa base LDAP, no caso especifico é um Active Directory.
Estou tendo dificuldades em acessar a “node” especifico que representa casa usuario para efetivar a autenticação dele. E a propria autenticação do server esta estranha. Eu nao consigo me autenticar com a minha senha, mas consigo me autenticar sem senha nenhuma. Alguem poderia me ajudar nesse ponto. Estou procurando tb um browser de LDAP mas nao estou encontrando nenhum legal.
Eu usava esse browser LDAP. É simples, atendeu minhas necessidades.
R
rborgespereira
Muito obrigado. Vou fazer alguns testes com ele e ver se consigo realizar a autenticação.
Abraços,
Ricardo.
A
adrianoanderson
Olá Ricardo,
Acredito que primeiro você precise se logar no Active Directory com acesso de administrador. Uma vez conectado, faça uma consulta pelo username e senha fornecidos pelo utilizador.
Segue um exemplo de código que pode ser útil:
importjava.util.Hashtable;importjavax.naming.AuthenticationException;importjavax.naming.Context;importjavax.naming.NamingEnumeration;importjavax.naming.NamingException;importjavax.naming.directory.Attributes;importjavax.naming.directory.DirContext;importjavax.naming.directory.InitialDirContext;importjavax.naming.directory.SearchControls;importjavax.naming.directory.SearchResult;publicclassLdapAuthentication{/** * Classe que realiza a conexão e autenticação ao LDAP * * @author Adriano Anderson *//* * Singleton */protectedstaticLdapAuthenticationinstanceLdap;/* * Implementação do Initial context para LDAP */publicstaticStringINITIAL_CTX="com.sun.jndi.ldap.LdapCtxFactory";/* * Servidor LDAP */publicstaticStringSERVIDOR="ldap://ENDERECO DO SERVIDOR:389";/* * Tipo de conexão realizada */publicstaticStringCONNECTION_TYPE="simple";/* * Nome distinto do admin */publicstaticStringADMIN_DN=NODEPRINCIPALDEACESSO;/* * Senha */publicstaticStringADMIN_PW=SENHAADMIN;/* * Diretório Base */publicstaticStringBASE_DN=NODEBASEUTILIZADORES;/* * Mensagem de Erro de Conexão ao Ldap */publicstaticStringMSG_ERROR_LDAP_CONNECTION="Não foi possível obter um contexto LDAP";/* * Mensagem de Erro sobre Validação do Login e Password */publicstaticStringMSG_ERROR_LDAP_VALIDATION_USER="Username ou Password Inválida";privateLdapAuthentication(){super();}/** * Obtém a mesma instância de LdapAuthentication para todas as chamadas * * @author Adriano Anderson * @return um objeto LdapAuthentication */publicstaticLdapAuthenticationgetInstance(){if(instanceLdap==null){instanceLdap=newLdapAuthentication();}returninstanceLdap;}/** * Método responsável por realizar a chamada para autenticação via ldap do * login e password passados como parâmetros. * * @author Adriano Anderson */publicbooleanauthentication(Stringlogin,Stringpassword){DirContextctx=null;SearchControlssc=null;Stringfiltro=null;NamingEnumerationcursor=null;booleanbResult=false;/* * Cria conexão padrão com LDAP */ctx=createLdapConnection();if(ctx!=null){sc=newSearchControls();sc.setSearchScope(SearchControls.SUBTREE_SCOPE);/* * Define atributos de retorno da consulta */String[]atributosParaRetornar={"distinguishedName"};sc.setReturningAttributes(atributosParaRetornar);/* * Especifica login para consulta */filtro="(&(sAMAccountName="+login+"))";try{cursor=ctx.search(BASE_DN,filtro,sc);if(cursor.hasMoreElements()){SearchResultresult=(SearchResult)cursor.nextElement();Attributesatt=result.getAttributes();Stringdn=(String)att.get("distinguishedName").get();/* * Se o login existe, tenta autenticar no LDAP com a senha * fornecida pelo usuário */bResult=validateUser(dn,password);}}catch(NamingExceptione){System.out.println(MSG_ERROR_LDAP_CONNECTION);e.printStackTrace();}}returnbResult;}/** * Método responsável por realizar a conexão padrão com o Ldap. * * @author Adriano Anderson */privateDirContextcreateLdapConnection(){DirContextctx=null;Hashtableenv=newHashtable();// Especifica INITIAL CONTEXTenv.put(Context.INITIAL_CONTEXT_FACTORY,INITIAL_CTX);// Especifica o IP/Nome e a porta do servidor LDAPenv.put(Context.PROVIDER_URL,SERVIDOR);// Usuário ADMINenv.put(Context.SECURITY_PRINCIPAL,ADMIN_DN);// Senha ADMINenv.put(Context.SECURITY_CREDENTIALS,ADMIN_PW);// Tipo de Conexãoenv.put(Context.SECURITY_AUTHENTICATION,CONNECTION_TYPE);try{// Cria um Initial Contextctx=newInitialDirContext(env);}catch(NamingExceptione){System.out.println(MSG_ERROR_LDAP_CONNECTION);e.printStackTrace();}returnctx;}/** * Método responsável por realizar a validação do login no Ldap. O campo dn * é distinguished name formado anteriormente a partir da consulta do login * no Ldap. * * @author Adriano Anderson */privatebooleanvalidateUser(Stringdn,Stringsenha){DirContextldapCtx=null;booleanbResult=false;Hashtableenv=newHashtable();// Especifica INITIAL CONTEXTenv.put(Context.INITIAL_CONTEXT_FACTORY,INITIAL_CTX);// Especifica o IP/Nome e a porta do servidor LDAPenv.put(Context.PROVIDER_URL,SERVIDOR);// Ldap Distingued Nameenv.put(Context.SECURITY_PRINCIPAL,dn);// Senha Usuárioenv.put(Context.SECURITY_CREDENTIALS,senha);// Tipo de Conexãoenv.put(Context.SECURITY_AUTHENTICATION,CONNECTION_TYPE);try{// Cria um Initial ContextldapCtx=newInitialDirContext(env);}catch(AuthenticationExceptionauEx){System.out.println(MSG_ERROR_LDAP_VALIDATION_USER);auEx.printStackTrace();}catch(NamingExceptionne){System.out.println(MSG_ERROR_LDAP_CONNECTION);ne.printStackTrace();}finally{if(ldapCtx!=null){bResult=true;}}returnbResult;}}
Boa Sorte!
Adriano
E
eduardo.cerqueira
Ricardo,
Para fazer autenticação no LDAP (Active Directory) não é necessária a comparação da senha dentro do AD, até porque essa informação não fica disponvel e mesmo que estivesse, ela com certeza estaria criptografada.
Mas ai você pergunta, como é que vou saber se a senha é valida ?
Simples, se você com um usuário valido conseguir se logar através da sua aplicação, quer dizer que a senha dele esta correta, perceba que não é necessário conectar com o administrador para que o teste de conexão funcione, qualquer usuário do domínio irá funcionar.
Faça um teste e coloque o resultado pra gente.
Dessa forma, você consegue realizar a autenticação.
Abraços,
Eduardo Cerqueira
R
rborgespereira
PessoALL,
Valeu mesmo. Estou fazendo a implementação disso agora e vou mandar uma resposta pra voces.
Abraços,
Ricardo.
A
adrianoanderson
Olá,
Acho que me expressei mal, quando falei
… uma vez conectado, faça uma consulta pelo username e senha fornecidos pelo utilizador …
quis dizer que deveria se conectar com a senha do usuário e o respectivo node recuperado do username passado como parâmetro, conforme está descrito no código.
Mas é claro que existem outras maneiras de implementação, melhores e piores.
Adriano Anderson.
R
rodrigopmatias
ai galera to com o mesmo problema só que aqui nao é um AD no meu caso estou usando openLDAP que acaba dando na mesma, os dois fazem a mesma coisa.
o meu problema e o seguinte, eu sei que o usuario uid=rodrigopmatias,ou=usuario,dc=sede,dc=setas tem a senha gravada no ldap 1234 em 4 campos, sambaLMPassword(LMHASH), sambaNTPassword(MD4) e userPassword(Criptografado) mas a autenticação nunca da certo, será se alguem tem um exemplo simples ai que possa destrinchar e disponinbilizar os ldifs para estudo?