consulta de atributo ldap de Python

Estoy tratando de modificar un autenticador basado en python para que murmur (software voip) funcione con mi árbol ldap.

El autenticador LDAP está disponible en:

http://www.winex.org/linux/zealot/src/mumble-scripts/Authenticators/LDAP/LDAPauth.py

Funciona, pero no del todo con mi diseño ldap, así que tengo que modificarlo un poco. Conozco un enfoque que podría funcionar, pero desafortunadamente no tengo más conocimientos sobre Python que los que aprendí de Google (aunque tengo otra experiencia en programación).

Mi diseño ldap se ve así:

charName=xxx, ou=people, dc=xxx, dc=com

Debajo de esto hay atributos almacenados como userPassword y login , entre otros.

El script de python anterior está diseñado para usar un enlace ldap para autenticar. En este caso tendría que enlazar como "charName=logindatafromapp, ou=people, dc=xxx, dc=com". Desafortunadamente, la gente no inicia sesión con "charName" pero con "login" que es un atributo, pero no es idéntico a "charName".

No conozco una forma de enlazar a un atributo, así que aquí está mi idea:

  • Primero me vinculo como administrador de ldap y realizo una búsqueda en todas las entradas para "logindatafromapp" y comparar ese valor con "login". Si se encuentra una coincidencia, agarro la coincidencia "charName" y volver a unir con eso charName como se pretendía originalmente.

Actualmente estoy atascado en la consulta de la "charName" value y al asignar ese valor a una variable, para poder usarlo en un segundo enlace ldap (google realmente no me ayudó).

Aquí está mi código:

ldap_conn = ldap.initialize(ldap_uri, 0)
ldap_conn.bind_s("cn=admin,dc=xxxxxxxx,dc=com","pass")
res = ldap_conn.search_s('ou=people,dc=xxxxxx,dc=com', ldap.SCOPE_ONELEVEL,'login=trony',['charName'])
print(res)

Luego imprime "[('charName=Trony,ou=people,dc=xxxxxxx,dc=com', {'charName': ['Trony']})]".

(El "login=trony") es un filtro temporal que tendría que reemplazar con el applogin variedad Mi problema ahora es ¿cómo puedo asignar "Trony" (en este caso) a una variable? ¿La salida parece ser una estructura especial?

preguntado el 01 de julio de 12 a las 17:07

2 Respuestas

'Trony' está en

res[0][1]['charName'][0]

Tomas el primer elemento de la lista: es una tupla; luego el primer elemento de la tupla; es un diccionario; luego el valor del diccionario para la clave 'charName'; es una lista una vez más; y luego el primer elemento de la lista.

Respondido 03 ago 13, 15:08

muchas gracias :), "name = res[0][0]{'charName'}[0]" no funciona, dice error de sintaxis. - user912877

más específicamente: Archivo "./LDAPauth.py", línea 205 test = res[0][0]{'charName'}[0] ^ SyntaxError: sintaxis no válida - user912877

fue res[0][1]['charName'][0] :) - user912877

Hay al menos dos alternativas:

  • Use el método que describe para buscar la entrada usando la información que tiene, en este caso el valor de la login atributo tal como lo ingresó el usuario y luego usar el DN que se encontró en un enlace simple o SASL o
  • Use SASL con mapeo de identidad para mapear el authId (el valor del login atributo) de tal manera que un enlace SASL tendrá éxito donde solo el valor del login el atributo es conocido

El primer método requiere una búsqueda y luego un enlace, el segundo puede requerir que las entradas de los usuarios tengan contraseñas reversibles (AES es un buen esquema de encriptación para ese propósito) dependiendo del mecanismo SASL que se elija. El uso de SASL con el mecanismo DIGEST-MD5 proporcionaría una forma de mapear identidades como se describe (todos los servidores LDAP de calidad profesional admiten dicho mecanismo de mapeo) y evitaría la necesidad de enviar una contraseña sin cifrar a través de una red, pero tiene la desventaja de no ser tan seguro como usar el enlace simple donde la contraseña se almacena como un resumen SHA-2 salado. Aunque DIGEST-MD5 no debe usarse porque requiere contraseñas reversibles y, por lo tanto, no es tan seguro como usar SHA-2 fuerte (con sal), está disponible para aplicaciones que lo requieran.

Respondido 02 Jul 12, 02:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.