Java y Active Directory (V): cambio de contraseña de usuarios

Finalizo la serie de artículos dedicados a la interacción entre Java y Active Directory con el desenlace de la operación de cambio de contraseña de un usuario. Presentaré dos artículos más. Hoy veremos como cambiar la contraseña de un usuario por parte del propio usuario (conociendo la anterior contraseña, por supuesto) y por parte de un administrador en el caso que no conozcamos la anterior contraseña, útil para fijar una contraseña nueva.

En la primera parte de esta serie de artículos vimos como localizar los controladores de dominio a través del servicio DNS. En la segunda parte nos atrevimos a validar un usuario utilizando simplemente LDAP, y vimos que era fácil. En la tercera parte realizamos una búsqueda para encontrar a un usuario a través de su correo electrónico. Finalmente, en la última entrada preparamos el terreno para el artículo de hoy introduciendo cómo podemos conectar a LDAP mediante SSL y, por tanto, efectuar una conexión LDAPS.

Cambiar una contraseña de un usuario es, al final, algo tan sencillo como modificar uno de los atributos del objeto que representa al usuario. En dicho objeto hay un atributo, unicodePwd, que corresponde a la contraseña del usuario codificada en UTF-16LE. Para modificar un atributo tenemos dos opciones correspondientes a operaciones básicas de LDAP: o bien sustituimos (machacamos) el atributo con un nuevo valor, o bien quitamos el antiguo y ponemos uno nuevo. Estas dos alternativas nos permiten dos escenarios diferentes.

Cambio de la contraseña por parte de un administrador
Podemos fijar una contraseña nueva de cualquier usuario y sin conocer la anterior contraseña si disponemos de un usuario privilegiado. En este caso conectamos con dicho usuario y reemplazamos el atributo correspondiente indicando como nuevo valor la nueva contraseña debidamente codificada. Podemos ver ejemplos en un artículo que ya vimos anteriormente (15/04/2015: el enlace ha dejado de funcionar, hay una copia en archive.org) y en esta otra entrada donde se ve una mejor alternativa a la codificación UTF de la nueva contraseña.

Cambio de la propia contraseña
Para poder hacer un cambio de contraseña de AD a través de LDAP hay que conectar al controlador de dominio sobre SSL, buscar el usuario y finalmente modificar el atributo correspondiente a la contraseña (unicodePwd) en dos pasos: primero eliminar el atributo con la anterior contraseña y después volver a añadirlo con la nueva. Todo esto en una misma transacción. Esta funcionalidad se puede ver en un script Perl presentado en esta página. También hay que tener en cuenta añadir dos comillas dobles en los extremos de la contraseña. Todo resumido queda así:

ModificationItem[] mods = new ModificationItem[2];  
BasicAttribute quita = new BasicAttribute("unicodePwd", ("\"" + antigua + "\"").getBytes("UTF-16LE"));  
mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, quita);  
BasicAttribute pon = new BasicAttribute("unicodePwd", ("\"" + nueva + "\"").getBytes("UTF-16LE"));  
mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, pon);  
context.modifyAttributes(usuariAD.getDistinguishedName(), mods);  

Entradas relacionadas: