अजगर + ldap का उपयोग करके सक्रिय निर्देशिका के खिलाफ प्रमाणीकरण


89

मैं पायथन + LDAP का उपयोग करके AD के खिलाफ कैसे प्रमाणित करूं? मैं वर्तमान में अजगर- 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: {'info': '80090308: LdapErr: DSID-0C090334, टिप्पणी: AcceptSecurityContextxt error, data 52e, vece', 'desc': 'अमान्य क्रेडेंशियल्स'}}

या

ldap। '}

मैं ठीक से बाँधने के लिए क्या याद कर रहा हूँ?

मुझे फेडोरा और खिड़कियों पर समान त्रुटियां हो रही हैं।


2
"... और यह सब पैदा कर रहा है आँसू है।" क्या आँसू बीयर्स या बियर के साथ तुकबंदी करते हैं?
philshem

जवाबों:


47

में गुम हो गया था

l.set_option(ldap.OPT_REFERRALS, 0)

Init से।


3
इस बग का मूल कारण यह है कि आपके पास प्रारंभिक प्रतिक्रिया में रेफरल है और विंडोज़ एलडीएपी कोड क्रेडेंशियल्स को रेफरल सर्वर को नहीं भेजता है। यदि आपने केर्बरोस क्रेडेंशियल्स का उपयोग किया है तो यह काम करना चाहिए।
schlenk

2
मेरे पास अलग-अलग लक्षण थे लेकिन इसी विकल्प ने मेरी समस्या को ठीक कर दिया। इसे एक ब्लॉग पोस्ट में सारांशित किया गया: chaverma.com/blog/index.php/2013/06/…
क्रिस

निश्चित नहीं है कि संबंधित है, लेकिन मुझे वही समस्या थी और ऐसा लगता है कि 1729 के समाधान ने कुछ किया है - लेकिन कभी-कभी एलडीएपी सर्वर सिर्फ त्वरित क्रेडिट का जवाब देता है। थोड़ी देर बाद यह शांत हो जाता है और फिर से काम करता है।
नितेय

28

यदि आप pywin32 का उपयोग करने के लिए खुले हैं, तो आप पायथन से Win32 कॉल का उपयोग कर सकते हैं। यह हम अपने चेरी वेब सर्वर में करते हैं:

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

3
सरल और साफ! धन्यवाद!
एलेक्सा गले

इस समाधान ने मेरे लिए पायथन फ्लास्क एप्लिकेशन में प्रतिबंधात्मक NTLM कॉर्पोरेट प्रॉक्सी के पीछे काम किया। कुछ अन्य LDAP- आधारित विकल्प बस काम नहीं करेंगे।
गिगाफ्लोप

7

मेरे लिए काम किया, l.set_option (ldap.OPT_REFERRALS, 0) ActiveDirectory तक पहुँचने की कुंजी थी। इसके अलावा, मुझे लगता है कि स्क्रिप्ट खत्म करने से पहले कनेक्शन बंद करने के लिए आपको "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")

यह पिछले उत्तर पर आधारित है ।


1
यह अब काम नहीं करता है, आप प्राप्त करेंगेAttributeError: module 'ldap' has no attribute 'open'
जोश कोरिया

3

यदि आपके पास Kerberos स्थापित है और AD से बात कर रहा है, जैसा कि मामला होगा, तो कहना, Centrify Express स्थापित और चल रहा है, आप बस अजगर-केर्बरोस का उपयोग कर सकते हैं। उदाहरण के लिए

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

यह सही होगा कि एक उपयोगकर्ता 'जो' के पास केर्बेरोस दायरे X.PIZZA.COM में पासवर्ड 'पिज्जा' है। (आम तौर पर, मुझे लगता है, बाद का विज्ञापन AD डोमेन के नाम के समान होगा)


2

मैं आपकी टिप्पणी @Johan Buret के बारे में देख रहा हूं कि DN आपकी समस्या को ठीक नहीं कर रहा है, लेकिन मेरा यह भी मानना ​​है कि आपको देखना चाहिए।

आपके उदाहरण को देखते हुए, AD में डिफ़ॉल्ट व्यवस्थापक खाते के लिए DN होगा: cn = Administrator, cn = Users, dc = mydomain, dc = co, dc = uk - कृपया कोशिश करें।


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)

लेकिन एक त्रुटि के बजाय अजगर सिर्फ लटका रहता है और किसी भी चीज का जवाब नहीं देगा। शायद मैं खोज क्वेरी गलत बना रहा हूं, खोज का आधार भाग क्या है? मैं साधारण बाँध के लिए DN के समान उपयोग कर रहा हूँ (ओह, और मुझे 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 का उपयोग कर रहा हूं और उदाहरण चालू खाते के लिए पंजीकृत है।


1

मेरे पास एक ही मुद्दा था, लेकिन यह पासवर्ड एन्कोडिंग के बारे में था

.encode('iso-8859-1')

समस्या का हल किया।


0

अपने सिस्टम पर लॉग इन करने के लिए एक विशिष्ट नाम का उपयोग करें। "CN=Your user,CN=Users,DC=b2t,DC=local" इसे AD सहित किसी भी LDAP सिस्टम पर काम करना चाहिए


0

के लिए मुझ से बदल रहा है simple_bind_s()करने के लिए bind()चाल किया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.