অজগর + ldap ব্যবহার করে সক্রিয় ডিরেক্টরিটির বিরুদ্ধে প্রমাণীকরণ


89

পাইথন + এলডিএপি ব্যবহার করে আমি কীভাবে AD এর বিরুদ্ধে প্রমাণীকরণ করব। আমি বর্তমানে পাইথন-এলডিপ লাইব্রেরি ব্যবহার করছি এবং এটি যেটি তৈরি করছে তা অশ্রুসঞ্জন।

আমি একটি সাধারণ ক্যোয়ারী সম্পাদন করতেও বাঁধতে পারি না:

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: info 'তথ্য': '80090308: LdapErr: DSID-0C090334, মন্তব্য: AcceptSecurityContext ত্রুটি, ডেটা 52e, vece', 'desc': 'অবৈধ শংসাপত্র'}

বা

ldap.OPERATIONS_ERROR: info 'তথ্য': '00000000: LdapErr: DSID-0C090627, মন্তব্য: এই ক্রিয়াকলাপ সম্পাদনের জন্য সংযোগের উপর একটি সফল বাঁধাই সম্পন্ন করতে হবে, '

সঠিকভাবে বাঁধতে আমি কী মিস করছি?

আমি ফেডোরা এবং উইন্ডোতে একই ত্রুটি পাচ্ছি।


4
"... এবং এটি যা উত্পাদন করছে তা হ'ল অশ্রু" " ভাল্লুক বা বিয়ারের সাথে কি অশ্রু ছড়াচ্ছে?
ফিল্মসেম

উত্তর:


48

আমি নিখোঁজ ছিলাম

l.set_option(ldap.OPT_REFERRALS, 0)

ইশ থেকে।


4
এই বাগের মূল কারণটি হ'ল প্রাথমিক প্রতিক্রিয়াতে আপনার রেফারেল রয়েছে এবং উইন্ডোজ এলডিএপি কোড রেফারেল সার্ভারে শংসাপত্রগুলি প্রেরণ করে না। আপনি যদি কার্বেরোস শংসাপত্রগুলি ব্যবহার করেন তবে এটি কাজ করা উচিত।
schlenk

4
আমার বিভিন্ন লক্ষণ ছিল তবে এই একই বিকল্পটি আমার সমস্যাটিকে স্থির করেছে। এটি একটি ব্লগ পোস্টে সংক্ষিপ্ত আকারে
ক্রিস

সম্পর্কিত কিনা তা নিশ্চিত নয়, তবে আমারও একই সমস্যা ছিল এবং 1729 এর সমাধানটি কিছু করেছিল বলে মনে হয় But তবে কখনও কখনও এলডিএপি সার্ভারটি ইনভ্যালিড ক্রেডিটালিয়াসকে তাত্ক্ষণিকভাবে উত্তর দেয়। কিছুক্ষণ পরে এটি শান্ত হয়ে আবার কাজ করে।
নিতাই

29

আপনি যদি পাইউইন 32 ব্যবহারের জন্য উন্মুক্ত হন তবে আপনি পাইথন থেকে উইন 32 কলগুলি ব্যবহার করতে পারেন। আমাদের চেরিপাই ওয়েব সার্ভারে এটি আমরা করি:

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

4
সহজ এবং পরিষ্কার! ধন্যবাদ!
আলেক্স্রোট

এই সলিউশনটি আমার কাছে নিষিদ্ধ এনটিএলএম কর্পোরেট প্রক্সিটির পিছনে পাইথন ফ্লাস্ক অ্যাপ্লিকেশনটিতে কাজ করেছিল। অন্যান্য কিছু এলডিএপি-ভিত্তিক বিকল্পগুলি কার্যকরভাবে কাজ করবে না।
গিগাফ্লপ

7

এটি আমার পক্ষে কাজ করেছিল, l.set_option (ldap.OPT_REFERRALS, 0) অ্যাক্টিভ ডিরেক্টরিতে অ্যাক্সেসের মূল চাবিকাঠি। তদুপরি, আমি মনে করি যে স্ক্রিপ্ট শেষ করার আগে সংযোগটি বন্ধ করার জন্য আপনার একটি "con.unbind ()" যুক্ত করা উচিত।


8
থেকে পাইথন-LDAP ডকুমেন্টেশন : দৃষ্টান্ত LDAPObjectদ্বারা ফিরে করছে initialize()। LDAP অবজেক্টটি মুছে ফেলা হলে সংযোগটি স্বয়ংক্রিয়ভাবে আনবাউন্ড এবং বন্ধ হয়ে যায়।
সেরেন লভবর্গ

আপনি অধিবেশনটি বন্ধ করুন, সংযোগটি নয়।
রোমুলাস

5

এখানে কিছু সহজ কোড যা আমার পক্ষে কাজ করে।

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

এটি পূর্ববর্তী উত্তরের ভিত্তিতে ।


4
এটি আর কাজ করে না, আপনি পাবেনAttributeError: module 'ldap' has no attribute 'open'
জোশ Correia

3

যদি আপনি কার্বেরোস ইনস্টল করে থাকেন এবং AD এর সাথে কথা বলছেন, যেমনটি ঘটে থাকে, বলুন, সেন্ট্রিফাই এক্সপ্রেস ইনস্টল এবং চলমান রয়েছে, আপনি কেবল পাইথন-কার্বেরোস ব্যবহার করতে পারেন। যেমন

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

ফিরে আসবে সত্য যে কোনও ব্যবহারকারী 'জো'-এর পাসওয়ার্ড' পিজ্জা 'রয়েছে কার্বেরোস রিয়েলএম এক্স.পিজাজএ.কোমে। (সাধারণত, আমি মনে করি, পরবর্তীকালে এডি ডোমেনের নামের মতো হবে)


2

ডিএন আপনার সমস্যা সমাধান না করার বিষয়ে @ জোহান বুরেটের কাছে আমি আপনার মন্তব্য দেখতে পাচ্ছি, তবে আমি এটিও বিশ্বাস করি যে এটি আপনার উচিত।

আপনার উদাহরণ দেওয়া হয়েছে, AD তে ডিফল্ট প্রশাসক অ্যাকাউন্টের জন্য ডিএন হবে: সিএন = প্রশাসক, সিএন = ব্যবহারকারী, ডিসি = মাইডোমাইন, ডিসি = কো, ডিসি = ইউ কে - দয়া করে চেষ্টা করে দেখুন।


2

দুর্দান্ত 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

আমি পাইথন 3 এ উপরোক্ত করেছি তবে এটি পাইথন 2 এর সাথে সামঞ্জস্যপূর্ণ বলে মনে করা হচ্ছে।


1

আমি যুক্ত করার চেষ্টা করেছি

l.set_option (ldap.OPT_REFERRALS, 0)

তবে ত্রুটির পরিবর্তে পাইথন কেবল স্তব্ধ হয়ে যায় এবং আর কোনও প্রতিক্রিয়া জানায় না। হতে পারে আমি অনুসন্ধানের ক্যোয়ারীটি ভুল নির্মাণ করছি, অনুসন্ধানের বেস অংশটি কী? আমি সাধারণ বাইন্ডের জন্য ডিএন হিসাবে একই ব্যবহার করছি (ওহ, এবং এর 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)

আমি এডি এলডিএস ব্যবহার করছি এবং উদাহরণটি বর্তমান অ্যাকাউন্টের জন্য নিবন্ধিত।


1

আমার একই সমস্যা ছিল তবে এটি পাসওয়ার্ড এনকোডিং সম্পর্কিত

.encode('iso-8859-1')

সমস্যার সমাধান.


0

আপনার সিস্টেমে লগ করার জন্য একটি বিশিষ্ট নাম ব্যবহার করুন। "CN=Your user,CN=Users,DC=b2t,DC=local" এটি AD সহ যে কোনও LDAP সিস্টেমে কাজ করা উচিত


0

জন্য আমার কাছ থেকে পরিবর্তন simple_bind_s()করতে bind()কৌতুক করেনি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.