سؤال

كيف يمكنني المصادقة ضد AD باستخدام Python + LDAP.أستخدم حاليًا مكتبة python-ldap وكل ما تنتجه هو الدموع.

لا يمكنني حتى الالتزام بإجراء استعلام بسيط:

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

تشغيل هذا مع myusername@mydomain.co.uk password username يعطيني أحد الخطأين:

Invalid Credentials - عندما أخطئ في كتابة بيانات اعتماد خاطئة أو أستخدمها عمدًا، تفشل المصادقة.

ldap.INVALID_CREDENTIALS:{'معلومات':'80090308:لدابير:DSID-0C090334، التعليق:خطأ AcceptSecurityContext، البيانات 52e، vece'، 'desc':'بيانات الاعتماد غير صالحة'}

أو

ldap.OPERATIONS_ERROR:{'معلومات':'00000000:لدابير:DSID-0C090627، التعليق:من أجل تنفيذ هذه العملية، يجب إكمال ربط ناجح على الاتصال. البيانات 0، vece'، 'desc':"خطأ في العمليات"}

ما الذي أفتقده للربط بشكل صحيح؟

أتلقى نفس الأخطاء في فيدورا والنوافذ.

هل كانت مفيدة؟

المحلول

كنت في عداد المفقودين

l.set_option(ldap.OPT_REFERRALS, 0)

من الحرف الأول.

نصائح أخرى

إذا كنت مستعدًا لاستخدام pywin32، فيمكنك استخدام استدعاءات Win32 من Python.هذا ما نقوم به في خادم الويب CherryPy الخاص بنا:

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

لقد نجح ذلك بالنسبة لي، l.set_option(ldap.OPT_REFERRALS, 0) كان المفتاح للوصول إلى ActiveDirectory.علاوة على ذلك، أعتقد أنه يجب عليك إضافة "con.unbind()" لإغلاق الاتصال قبل إنهاء البرنامج النصي.

إليك بعض التعليمات البرمجية البسيطة التي تناسبني.

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

ويستند هذا على أ الإجابة السابقة.

إذا كان لديك Kerberos مثبتًا وتتحدث إلى AD، كما هو الحال مع تثبيت Centrify Express وتشغيله، على سبيل المثال، فيمكنك فقط استخدام python-kerberos.على سبيل المثال

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

سيُرجع True لأن المستخدم "joe" لديه كلمة مرور "pizza" في عالم Kerberos X.PIZZA.COM.(عادة، أعتقد أن الأخير سيكون هو نفس اسم المجال AD)

أرى أن تعليقك على @Johan Buret حول عدم قيام الاسم المميز بإصلاح مشكلتك، لكنني أعتقد أيضًا أن هذا هو ما يجب أن تنظر فيه.

في ضوء مثالك، سيكون الاسم المميز لحساب المسؤول الافتراضي في AD هو:cn=Administrator,cn=Users,dc=mydomain,dc=co,dc=uk - يرجى تجربة ذلك.

حاولت أن أضيف

l.set_option(ldap.OPT_REFERRALS, 0)

ولكن بدلاً من حدوث خطأ، تتوقف لغة Python ولن تستجيب لأي شيء بعد الآن.ربما أكون قد قمت ببناء استعلام البحث بشكل خاطئ، ما هو الجزء الأساسي من البحث؟أنا أستخدم نفس الاسم المميز للربط البسيط (أوه، وكان علي أن أفعل ذلك l.simple_bind, ، بدلاً من l.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)

أنا أستخدم AD LDS وتم تسجيل المثيل للحساب الحالي.

واجهت نفس المشكلة، ولكن كان الأمر يتعلق بترميز كلمة المرور

.encode('iso-8859-1')

حل المشكلة.

على أساس ممتاز البرنامج التعليمي ldap3:

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

لقد فعلت ما سبق في Python3 ولكن من المفترض أن يكون متوافقًا مع Python 2.

استخدم الاسم المميز لتسجيل الدخول إلى نظامك."CN=Your user,CN=Users,DC=b2t,DC=local"وينبغي أن تعمل على أي نظام LDAP، بما في ذلك AD

بالنسبة لي التغيير من simple_bind_s() ل bind() فعلت الحيلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top