exceptions - Autenticación contra el directorio activo usando python+ldap
python ldap exceptions (11)
Aquí hay un código simple que funciona para mí.
import ldap # run ''pip install python-ldap'' to install ldap module.
conn = ldap.open("ldaphost.company.com")
conn.simple_bind_s("[email protected]", "mypassword")
Esto se basa en una respuesta previa .
¿Cómo me autentico contra AD usando Python + LDAP? Actualmente estoy usando la biblioteca python-ldap y todo lo que está produciendo es lágrimas.
Ni siquiera puedo enlazar para realizar una consulta simple:
import sys
import ldap
Server = "ldap://my-ldap-server"
DN, Secret, un = sys.argv[1:4]
Base = "dc=mydomain,dc=co,dc=uk"
Scope = ldap.SCOPE_SUBTREE
Filter = "(&(objectClass=user)(sAMAccountName="+un+"))"
Attrs = ["displayName"]
l = ldap.initialize(Server)
l.protocol_version = 3
print l.simple_bind_s(DN, Secret)
r = l.search(Base, Scope, Filter, Attrs)
Type,user = l.result(r,60)
Name,Attrs = user[0]
if hasattr(Attrs, ''has_key'') and Attrs.has_key(''displayName''):
displayName = Attrs[''displayName''][0]
print displayName
sys.exit()
Ejecutar esto con [email protected] password username
me da uno de dos errores:
Invalid Credentials
no válidas: cuando escribo incorrectamente o uso intencionalmente credenciales incorrectas, no se autentica.
ldap.INVALID_CREDENTIALS: {''info'': ''80090308: LdapErr: DSID-0C090334, comentario: error de AcceptSecurityContext, datos 52e, vece'', ''desc'': ''credenciales no válidas''}
O
ldap.OPERATIONS_ERROR: {''info'': ''00000000: LdapErr: DSID-0C090627, comentario: para realizar esta operación se debe completar un enlace exitoso en la conexión., data 0, vece'', ''desc'': ''Error de operaciones ''}
¿Qué me estoy perdiendo para enlazar correctamente?
Estoy obteniendo los mismos errores en fedora y windows.
Eso funcionó para mí, l.set_option (ldap.OPT_REFERRALS, 0) fue la clave para acceder a ActiveDirectory. Además, creo que debe agregar un "con.unbind ()" para cerrar la conexión antes de finalizar el script.
Para mí, cambiar de simple_bind_s()
a bind()
hizo el truco.
Si está abierto a usar pywin32, puede usar llamadas Win32 desde Python. Esto es lo que hacemos en nuestro servidor web CherryPy:
import win32security
token = win32security.LogonUser(
username,
domain,
password,
win32security.LOGON32_LOGON_NETWORK,
win32security.LOGON32_PROVIDER_DEFAULT)
authenticated = bool(token)
Si esto es parte de una aplicación web destinada a usuarios de anuncios autenticados, esta pregunta podría ser de interés.
Tenía el mismo problema, pero estaba relacionado con la codificación de la contraseña
.encode(''iso-8859-1'')
Resuelve el problema.
Traté de agregar
l.set_option (ldap.OPT_REFERRALS, 0)
pero en lugar de un error, Python simplemente se cuelga y no responde a nada más. Tal vez estoy construyendo la consulta de búsqueda equivocada, ¿cuál es la parte básica de la búsqueda? Estoy usando lo mismo que el DN para el enlace simple (ah, y tuve que hacer l.simple_bind
, en lugar de l.simple_bind_s
):
import ldap
local = ldap.initialize("ldap://127.0.0.1")
local.simple_bind("CN=staff,DC=mydomain,DC=com")
#my pc is not actually connected to this domain
result_id = local.search("CN=staff,DC=mydomain,DC=com", ldap.SCOPE_SUBTREE, "cn=foobar", None)
local.set_option(ldap.OPT_REFERRALS, 0)
result_type, result_data = local.result(result_id, 0)
Estoy usando AD LDS y la instancia está registrada para la cuenta actual.
Use un nombre distinguido para iniciar sesión en su sistema. "CN=Your user,CN=Users,DC=b2t,DC=local"
Debería funcionar en cualquier sistema LDAP, incluido AD
Veo tu comentario a @Johan Buret sobre que el DN no resuelve tu problema, pero también creo que es lo que debes considerar.
Dado su ejemplo, el DN para la cuenta de administrador predeterminada en AD será: cn = Administrador, cn = Usuarios, dc = mydomain, dc = co, dc = uk - por favor intente eso.
estaba perdido
l.set_option(ldap.OPT_REFERRALS, 0)
Desde el init.
si tiene instalado Kerberos y habla con AD, como sería el caso, por ejemplo, con Centrify Express instalado y en ejecución, podría usar python-kerberos. P.ej
import kerberos
kerberos.checkPassword(''joe'',''pizza'',''krbtgt/x.pizza.com'',''X.PIZZA.COM'')`
Devolvería True un usuario ''joe'' tiene contraseña ''pizza'' en el reino de Kerberos X.PIZZA.COM. (Por lo general, creo que este último sería el mismo que el nombre del Dominio AD)