2008-09-26 11 views
77

का उपयोग कर सक्रिय निर्देशिका के खिलाफ प्रमाणीकरण मैं पाइथन + एलडीएपी का उपयोग करके एडी के खिलाफ कैसे प्रमाणित करूं। मैं वर्तमान में पाइथन-एलडीएपी लाइब्रेरी का उपयोग कर रहा हूं और यह सब उत्पादन कर रहा है आँसू।पायथन + 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() 

[email protected] password username के साथ इस रनिंग मुझे दो त्रुटियों में से एक देता है:

Invalid Credentials - या जब मैं गलत टाइप जानबूझकर गलत क्रेडेंशियल्स यह विफल रहता है का उपयोग प्रमाणित करने के लिए।

ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece', 'desc': 'Invalid credentials'}

या

ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, vece', 'desc': 'Operations error'}

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

मुझे फेडोरा और विंडोज़ पर एक ही त्रुटि मिल रही है।

+1

"... और यह सब उत्पादन कर रहा है आँसू।" ** ** आँसू ** बीयर या बीयर के साथ कविता? – philshem

उत्तर

43

मैं

l.set_option(ldap.OPT_REFERRALS, 0) 

init से याद आ रही थी।

+1

मैं यह नहीं बता सकता कि यह आपकी समस्या का समाधान करता है या नहीं। –

+2

मुझे एक ही समस्या थी, और यह मेरे लिए हल हो गई। – Staale

+3

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

1

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

+0

नहीं, यह नहीं था। – 1729

23

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

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

सरल और साफ! धन्यवाद! – alexroat

2

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

आपके उदाहरण को देखते हुए, एडी में डिफ़ॉल्ट व्यवस्थापक खाते के लिए डीएन होगा: सीएन = प्रशासक, सीएन = उपयोगकर्ता, डीसी = mydomain, डीसी = सह, डीसी = यूके - कृपया इसे आज़माएं।

7

वह मेरे लिए काम किया, l.set_option (ldap.OPT_REFERRALS, 0) ActiveDirectory तक पहुँचने के लिए महत्वपूर्ण था। इसके अलावा, मुझे लगता है कि आपको स्क्रिप्ट को खत्म करने से पहले कनेक्शन को बंद करने के लिए "con.unbind()" जोड़ना चाहिए।

+7

[पायथन-एलडीएपी दस्तावेज] से (http://www.python-ldap.org/doc/html/ldap.html): 'LDAPObject' के उदाहरण 'प्रारंभिक()' द्वारा वापस लौटाए जाते हैं। एलडीएपी ऑब्जेक्ट हटा दिए जाने पर कनेक्शन स्वचालित रूप से अनबाउंड और बंद हो जाता है। –

+0

आप कनेक्शन बंद करते हैं, कनेक्शन नहीं। – Romulus

0

यदि यह प्रमाणीकृत विज्ञापन-प्रयोक्ताओं के लिए इच्छित वेबपैप का हिस्सा है, तो this so question रुचि का हो सकता है।

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) 

मैं ई एलडीएस उपयोग कर रहा हूँ और उदाहरण चालू खाता के लिए पंजीकृत किया गया है ।

3

यदि आपके पास केर्बेरोस स्थापित है और एडी से बात कर रहा है, तो कहें, Centrify Express स्थापित और चल रहा है, तो आप केवल पाइथन-केर्बेरोस का उपयोग कर सकते हैं।जैसे

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

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

0

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

3

यहां कुछ सरल कोड है जो मेरे लिए काम करता है।

import ldap # run 'pip install python-ldap' to install ldap module. 
conn = ldap.open("ldaphost.company.com") 
conn.simple_bind_s("[email protected]", "mypassword") 

यह previous answer पर आधारित है।

1

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

.encode('iso-8859-1') 

समस्या हल के बारे में था।

संबंधित मुद्दे