Authentifizieren gegen aktives Verzeichnis mit Python + ldap
-
02-07-2019 - |
Frage
Wie authentifizieren ich gegen AD über LDAP Python +. Ich bin derzeit die Python-ldap-Bibliothek und alle es produziert wird, sind die 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()
Ausführen dieses mit myusername@mydomain.co.uk password username
gibt mir eine von zwei Fehlern:
Invalid Credentials
- Wenn ich falsch eingeben oder verwenden absichtlich falsche Zugangsdaten es kann keine Authentifizierung
ldap.INVALID_CREDENTIALS: { 'info': '80090308: LdapErr: DSID-0C090334, Kommentar: AcceptSecurityContext Fehler, Daten 52e, vece', 'ab': 'Ungültige Zugangsdaten'}
oder
ldap.OPERATIONS_ERROR: { 'info': '00000000: LdapErr: DSID-0C090627, Kommentar:. Um diese Operation zu einem erfolgreichen binden ausführen muss auf der Verbindung durchgeführt werden, Daten 0, vece', 'desc': 'Betriebsfehler'}
Was bin ich richtig zu binden verpassten?
Ich erhalte die gleichen Fehler auf Filzhut und Fenster.
Lösung
I fehlte
l.set_option(ldap.OPT_REFERRALS, 0)
Von der init.
Andere Tipps
Wenn Sie zur Verwendung pywin32 geöffnet sind, können Sie Win32 aus Python ruft. Dies ist, was wir in unserem CherryPy Webserver tun:
import win32security
token = win32security.LogonUser(
username,
domain,
password,
win32security.LOGON32_LOGON_NETWORK,
win32security.LOGON32_PROVIDER_DEFAULT)
authenticated = bool(token)
Das ist für mich gearbeitet, l.set_option (ldap.OPT_REFERRALS, 0) war der Schlüssel für die ActiveDirectory- zuzugreifen. Außerdem denke ich, dass Sie sollten ein „con.unbind ()“ hinzufügen, um die Verbindung zu schließen, bevor das Skript beenden.
Hier ist ein einfacher Code, der für mich arbeitet.
import ldap # run 'pip install python-ldap' to install ldap module.
conn = ldap.open("ldaphost.company.com")
conn.simple_bind_s("myuser@company.com", "mypassword")
Dies basiert auf einem vorherige Antwort .
Wenn Sie die Kerberos installiert haben und AD sprechen, als wäre der Fall mit, sagen wir, installiert Centrify Express und ausgeführt wird, können Sie nur Python-kerberos verwenden. Z.
import kerberos
kerberos.checkPassword('joe','pizza','krbtgt/x.pizza.com','X.PIZZA.COM')`
zurückkehren würde Wahr einen Benutzer 'joe' hat Passwort 'Pizza' in der Kerberos-Realm X.PIZZA.COM. (In der Regel, glaube ich, wäre dies die gleich wie der Name der AD-Domain)
Ich sehe Ihren Kommentar zu @Johan Buret über die DN Ihr Problem nicht Fixierung, aber ich glaube auch, dass das, was Sie suchen in sollte.
Ihr Beispiel gegeben, wird der DN für das Standard-Administratorkonto in AD sein: cn = Administrator, cn = Users, dc = mydomain, dc = co, dc = uk -. Bitte versuchen Sie, dass
Ich habe versucht, hinzuzufügen
l.set_option (ldap.OPT_REFERRALS, 0)
aber anstelle eines Fehlers Python hängt nur und reagiert nicht mehr auf irgendetwas. Ich baue die Suchabfrage falsch Vielleicht, was ist das Basisteil der Suche? Ich bin die gleiche wie die DN für die einfache Bindung mit (oh, und ich hatte l.simple_bind
, statt l.simple_bind_s
zu 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 bin mit AD LDS und der Instanz für das aktuelle Konto registriert.
Ich hatte das gleiche Problem, aber es war in Bezug auf die Passwort-Codierung
.encode('iso-8859-1')
das Problem gelöst.
Aufgrund der sehr guten 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
habe ich die oben in Python3 aber es soll mit Python 2 kompatibel sein.
Verwenden Sie einen eindeutigen Namen auf Ihrem system."CN=Your user,CN=Users,DC=b2t,DC=local"
anmelden
Es sollte auf jedem LDAP-System arbeiten, einschließlich AD
Für mich von simple_bind_s()
zu bind()
Wechsel hat den Trick.