2015-02-18 777 views
8

Sto tentando di aggiornare un po 'di codice in python3, usando la versione "0.9.7.4" di ldap3. (https://pypi.python.org/pypi/ldap3)Come associare (autenticare) un utente con ldap3 in python3

In precedenza, ho usato python-ldap con python2 per autenticare un utente in questo modo:

import ldap 
address = "ldap://HOST:389" 
con = ldap.initialize(address) 
base_dn = "ourDN=jjj" 
con.protocol_version = ldap.VERSION3 
search_filter = "(uid=USERNAME)" 
result = con.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter, None) 
user_dn = result[0][0] # get the user DN 
con.simple_bind_s(user_dn, "PASSWORD") 

Ciò restituisce correttamente (97, [], 2, []) sulla password corretta, e solleva ldap.INVALID_CREDENTIALS su un tentativo di binding utilizzando una password errata .

Utilizzando ldap3 in python3 sto facendo la seguente:

from ldap3 import Server, Connection, AUTH_SIMPLE, STRATEGY_SYNC, ALL 
s = Server(HOST, port=389, get_info=ALL) 
c = Connection(s, authentication=AUTH_SIMPLE, user=user_dn, password=PASSWORD, check_names=True, lazy=False, client_strategy=STRATEGY_SYNC, raise_exceptions=True) 
c.open() 
c.bind() 

Sta aumentando la seguente eccezione:

ldap3.core.exceptions.LDAPInvalidCredentialsResult: LDAPInvalidCredentialsResult - 49 - invalidCredentials - [{'dn': '', 'message': '', 'type': 'bindResponse', 'result': 0, 'saslCreds': 'None', 'description': 'success', 'referrals': None}] 

sto usando il valore user_dn restituito dalla ricerca LDAP di python2, dal momento che questo sembra funzionare in python2.

Come posso ottenere questo per associare correttamente utilizzando ldap3 in python3?

(Una cosa strana, ho notato, è che LDAPInvalidCredentialsResult del LDAP3 include 'description': 'success'. Sto indovinando questo significa solo risposta ricevuto con successo ...)

+0

Testato correttamente utilizzando la * password * errata e rilevato che l'Eccezione risultante è diversa, 'ldap3.core.exceptions.LDAPInvalidCredentialsResult: LDAPInvalidCredentialsResult - 49 - invalidCredentials - Nessuno - Nessuno - bindResponse - None' e non contiene' ' descrizione ':' successo'' ... bug? – monkut

risposta

11

Sono l'autore di LDAP3, impostare raise_exceptions=False nella definizione di connessione e controllare il connection.result dopo il binding. Dovresti ottenere il motivo per cui il tuo bind() non ha avuto successo.

+0

Grazie! Ho controllato usando 'raise_exceptions = False', ma' connection.result' non sembra contenere nulla di utile, che posso dire: '>>> c.result {'dn': '', 'risultato': 49 , 'message': '', 'description': 'invalidCredentials', 'type': 'bindResponse', 'saslCreds': 'None', 'referral': Nessuno} ' – monkut

+0

Rianalizzare la connessione,' c' sopra con 'raise_exceptions = True' restituisce ancora' 'description': 'success'', quando la password indicata è corretta. – monkut

+0

Si noti che il contenuto 'c.result' è invariato se la password è corretta, o meno, a differenza del risultato dell'eccezione. – monkut