martes, 24 de junio de 2008

Autenticación con LDAP en ActiveDirectory

ActiveDirectory es un servicio de Windows Server que mantiene información de la red tales como los usuarios registrados, los equipos conectados, etc. Soporta el protocolo LDAP, por lo que este consistirá en hacer una simple clase que permita autenticar un usuario y una contraseña utilizando el ActiveDirectory.



Si estamos haciendo una aplicación que necesite un inicio de sesión, convendría mejor que el usuario usara el mismo nombre de usuario y contraseña que utiliza cuando trabaja en red.



Un ejemplo simple de autenticación con LDAP se encuentra aquí LDAP Autentication.

Obteniendo la configuración del dominio de red

En una red windows existe el servidor que contiene toda la información de la red. Este se llama "Servidor de Dominio". Debemos consultar con nuestro administrador de red cuál es el nombre de este equipo para hacer nuestra aplicación.



Para nuestro ejemplo, nuestro servidor de red se llamará spdom01.



Necesitamos, además, saber cuáles son las cadenas de utiliza el LDAP. Podemos consultarle, también, a nuestro administrador de red. Pero si él piensa que nos hemos vuelto espesos, mejor averiguémoslo nosotros mismos.



Para ello descargaremos un programa que me resulta muy útil. Se llama Softerra LDAP Browser. Es gratuito.







Una vez descargado e instalado, crearemos un perfil. Entramos a la opción File > New profile. Escribimos un nombre de referencia, por ejemplo "Nuestra red".



Cuando aparezca la ventana "Host information" debemos indicar el nombre del servidor de dominio en la casilla "Host"



Y hacemos clic en el botón "Fetch DNS".

Con esto, el LDAP Browser consultará al servidor y obtendrá las cadenas de base DN. A mi me aparecen unas cadenas que por seguridad no las publicaré.



Clic en "Siguiente".



Luego nos pedirá nuestras credenciales. Pues aquí ingresamos nuestro nombre de usuario y nuestra contraseña.



No sé si está mal configurado este servicio en mi red, ya que no soy el administrador. Yo he tratado de colocar mi usuario normal, pero no ingresa. Después de muchas pruebas, logré ingresar escribiendo el nombre de mi usuario seguido de "@" y el dominio, como si fuera mi correo electrónico. Algo así:



Digo que podría estar mal, ya que mi correo electrónico es diferente. Anyway!.



Escribimos nuestra contraseña, clic en "Finalizar"



Y listo, ya deberíamos visualizar los objetos del servidor.

Ahora, examinemos un poco estos objetos. No podemos malograr nada porque supuestamente somos simples usuarios y no administradores del dominio.



Revisemos la carpeta "Users" y busquemos nuestro nombre de usuario.



Yo lo encontré, y esta es la información. Pero hay que notar las siguientes cadenas:

  • cn
  • DisplayName
  • distinguedName

La cadena CN es lo que nos importa realmente. Revisa el título del LDAP Browser. Allí aparecerá la cadena completa de nuestro usuario.

CN=DIEGO ENRIQUE SILVA LIMACO,CN=Users,DC=andes,DC=com,DC=pe


El mio está mal configurado y me aparece todo mi nombre completo. Es decir, que si deseo iniciar sesión usando LDAP debería usar mi nombre completo como nombre de usuario. Bueno, hagamos una clase así, siguiendo el ejemplo de Sun.



Login.java
19 public class Login {

20

21 static final String LDAP_URL = "ldap://spdom01:389/DC=andes,DC=com,DC=pe";

22

23 public boolean login(String username, String password) {

24 Hashtable env = new Hashtable();

25 env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

26 env.put(Context.PROVIDER_URL, LDAP_URL);

27 env.put(Context.SECURITY_AUTHENTICATION, "simple");

28 env.put(Context.SECURITY_PRINCIPAL, "CN="+username.toUpperCase()+ ", cn=Users, DC=andes,DC=com,DC=pe");

29 env.put(Context.SECURITY_CREDENTIALS, password);

30 try {

31

32 DirContext ctx = new InitialDirContext(env);

33 return true;

34 } catch (NamingException ex) {

35 Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);

36 }

37 return false;

38

39

40 }

41 }

42

43

Y cuando queramos usar la clase, simplemente le pasamos el usuario y contraseña.

LoginTest.java
28         String username = "DIEGO ENRIQUE SILVA LIMACO";

29 String password = "LoremIpsum";

30 Login instance = new Login();

31 boolean result = instance.login(username, password);



Pero en mi caso, como es muy incómodo escribir todo mi nombre como nombre de usuario, modificaré mi clase Login y colocaré:

28         env.put(Context.SECURITY_PRINCIPAL, username.toUpperCase()+ "@andes.com.pe");

Y lo invocaré así:

28         String username = "dsilva";

29 String password = "LoremIpsum";

30 Login instance = new Login();

31 boolean result = instance.login(username, password);

Y listo