web-dev-qa-db-de.com

Authentifizierung gegen Active Directory mit Python + LDAP

Wie authentifiziere ich mich gegen AD mit Python + LDAP? Ich verwende derzeit die Python-ldap-Bibliothek und produziert nur Tränen.

Ich kann nicht einmal binden, um eine einfache Abfrage auszuführen:

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()

Das Ausführen mit [email protected] password username gibt mir einen von zwei Fehlern:

Invalid Credentials - Wenn ich falsch schreibe oder absichtlich falsche Anmeldeinformationen verwende, konnte ich mich nicht authentifizieren.

ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, Kommentar: AcceptSecurityContext-Fehler, Daten 52e, Vece', 'desc': 'Ungültige Berechtigungsnachweise'}

Oder 

ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, Kommentar: Damit diese Operation ausgeführt werden kann, muss eine erfolgreiche Bindung für die Verbindung hergestellt werden., data 0, vece', 'desc': 'Operationsfehler '}

Was verpasse ich, um richtig zu binden?

Ich bekomme die gleichen Fehler in Fedora und Windows.

83
1729

Ich habe gefehlt 

l.set_option(ldap.OPT_REFERRALS, 0)

Von der init.

44
1729

Wenn Sie pywin32 verwenden möchten, können Sie Win32-Aufrufe von Python aus verwenden. Das machen wir auf unserem CherryPy-Webserver:

import win32security
token = win32security.LogonUser(
    username,
    domain,
    password,
    win32security.LOGON32_LOGON_NETWORK,
    win32security.LOGON32_PROVIDER_DEFAULT)
authenticated = bool(token)
24
davidavr

Das funktionierte für mich: l.set_option (ldap.OPT_REFERRALS, 0) war der Schlüssel zum Zugriff auf ActiveDirectory. Darüber hinaus denke ich, dass Sie ein "con.unbind ()" hinzufügen sollten, um die Verbindung zu schließen, bevor Sie das Skript beenden.

7
alfredocambera

Hier ist ein einfacher Code, der für mich funktioniert.

import ldap  # run 'pip install python-ldap' to install ldap module.
conn = ldap.open("ldaphost.company.com")
conn.simple_bind_s("[email protected]", "mypassword")

Dies basiert auf einer vorherigen Antwort .

4
JohnMudd

wenn Sie Kerberos installiert haben und mit AD sprechen, wie z. B. Centrify Express installiert ist und ausgeführt wird, können Sie Python-Kerberos verwenden. Z.B.

import kerberos
kerberos.checkPassword('joe','pizza','krbtgt/x.pizza.com','X.PIZZA.COM')`

würde zurückgeben, dass ein Benutzer "Joe" das Kennwort "Pizza" im Kerberos-Realm X.PIZZA.COM . hat.

3
Dima Pasechnik

Ich sehe Ihren Kommentar an @Johan Buret, dass der DN Ihr Problem nicht behoben hat, aber ich glaube auch, dass Sie sich darum kümmern sollten.

In Ihrem Beispiel lautet der DN für das Standardadministratorkonto in AD: Cn = Administrator, cn = Benutzer, dc = meineDomäne, dc = co, dc = uk.

2
Daniel Bungert

Ich habe versucht hinzuzufügen

l.set_option (ldap.OPT_REFERRALS, 0)

aber statt eines Fehlers hängt Python einfach und reagiert nicht mehr auf irgendetwas. Vielleicht baue ich die Suchabfrage falsch auf. Was ist der Basisteil der Suche? Ich verwende dasselbe wie den DN für das einfache Binden (oh, und ich musste l.simple_bind statt l.simple_bind_s tun):

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)

Ich verwende AD LDS und die Instanz ist für das aktuelle Konto registriert.

1
lanoxx

Ich hatte das gleiche Problem, aber es ging um die Passwortverschlüsselung

.encode('iso-8859-1')

Problem gelöst.

1
Dr.Ü

Für mich war der Wechsel von simple_bind_s() zu bind() der Trick.

0
xcl

Verwenden Sie einen Distinguished Name, um sich an Ihrem System anzumelden. "CN=Your user,CN=Users,DC=b2t,DC=local"Es sollte auf jedem LDAP-System, einschließlich AD, funktionieren

0
Johan Buret

Basierend auf dem ausgezeichneten ldap3 Tutorial :

>>> from ldap3 import Server, Connection, ALL, NTLM
>>> server = Server('server_name_or_ip', get_info=ALL)
>>> conn = Connection(server, user="user_name", password="password", auto_bind=True)
>>> conn.extend.standard.who_am_i()
>>> server.info

Ich habe das oben in Python3 gemacht, aber es sollte mit Python 2 kompatibel sein.

0
Nagev