Bagaimana cara mengotentikasi AD menggunakan Python + LDAP. Saat ini saya menggunakan pustaka python-ldap dan yang dihasilkan hanyalah air mata.
Saya bahkan tidak bisa mengikat untuk melakukan kueri sederhana:
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()
Menjalankan ini dengan [email protected] password username
memberi saya salah satu dari dua kesalahan:
Invalid Credentials
- Saat saya salah mengetik atau sengaja menggunakan kredensial yang salah, autentikasi gagal.
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, komentar: kesalahan AcceptSecurityContext, data 52e, vece', 'desc': 'Invalid credentials'}
Atau
ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, komentar: Untuk melakukan operasi ini, pengikatan yang berhasil harus diselesaikan pada koneksi., data 0, vece', 'desc': 'Operations error '}
Apa yang saya lewatkan untuk mengikat dengan benar?
Saya mendapatkan kesalahan yang sama di fedora dan windows.
Jawaban:
aku menghilang
l.set_option(ldap.OPT_REFERRALS, 0)
Dari init.
sumber
Jika Anda terbuka untuk menggunakan pywin32, Anda dapat menggunakan panggilan Win32 dari Python. Inilah yang kami lakukan di server web CherryPy kami:
import win32security token = win32security.LogonUser( username, domain, password, win32security.LOGON32_LOGON_NETWORK, win32security.LOGON32_PROVIDER_DEFAULT) authenticated = bool(token)
sumber
Itu berhasil bagi saya, l.set_option (ldap.OPT_REFERRALS, 0) adalah kunci untuk mengakses ActiveDirectory. Selain itu, menurut saya Anda harus menambahkan "con.unbind ()" untuk menutup koneksi sebelum menyelesaikan skrip.
sumber
LDAPObject
dikembalikan olehinitialize()
. Sambungan secara otomatis tidak terikat dan ditutup saat objek LDAP dihapus.Berikut beberapa kode sederhana yang berhasil untuk saya.
import ldap # run 'pip install python-ldap' to install ldap module. conn = ldap.open("ldaphost.company.com") conn.simple_bind_s("[email protected]", "mypassword")
Ini didasarkan pada jawaban sebelumnya .
sumber
AttributeError: module 'ldap' has no attribute 'open'
jika Anda memiliki Kerberos terinstal dan berbicara dengan AD, seperti halnya dengan, katakanlah, Centrify Express diinstal dan dijalankan, Anda mungkin hanya menggunakan python-kerberos. Misalnya
import kerberos kerberos.checkPassword('joe','pizza','krbtgt/x.pizza.com','X.PIZZA.COM')`
akan mengembalikan True pengguna 'joe' memiliki kata sandi 'pizza' di ranah Kerberos X.PIZZA.COM. (biasanya, menurut saya, nama yang terakhir sama dengan nama Domain AD)
sumber
Saya melihat komentar Anda untuk @Johan Buret tentang DN yang tidak memperbaiki masalah Anda, tetapi saya juga percaya bahwa itulah yang harus Anda perhatikan.
Diberikan contoh Anda, DN untuk akun administrator default di AD adalah: cn = Administrator, cn = Users, dc = mydomain, dc = co, dc = uk - silakan coba.
sumber
Berdasarkan tutorial ldap3 yang sangat baik :
>>> 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
Saya melakukan hal di atas dengan Python3 tetapi seharusnya kompatibel dengan Python 2.
sumber
Saya mencoba menambahkan
tetapi alih-alih kesalahan, Python hanya hang dan tidak merespons apa pun lagi. Mungkin saya salah membuat kueri penelusuran, apa yang menjadi bagian Basis dari penelusuran? Saya menggunakan sama dengan DN untuk ikatan sederhana (oh, dan saya harus melakukan
l.simple_bind
, bukanl.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)
Saya menggunakan AD LDS dan instance terdaftar untuk akun saat ini.
sumber
Saya memiliki masalah yang sama, tetapi ini terkait dengan pengkodean kata sandi
.encode('iso-8859-1')
Memecahkan masalah.
sumber
Gunakan Nama yang Dibedakan untuk masuk ke sistem Anda.
"CN=Your user,CN=Users,DC=b2t,DC=local"
Ini harus bekerja pada sistem LDAP apa pun, termasuk ADsumber
Bagi saya, mengubah dari
simple_bind_s()
menjadibind()
berhasil.sumber