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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top