2008-09-26 3 views
77

Как выполнить аутентификацию с помощью AD с помощью Python + LDAP. В настоящее время я использую библиотеку 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() 

Запуск этого с [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'}

Что я упускаю, чтобы связать должным образом?

Я получаю те же ошибки в Fedora и Windows.

+1

«... и все, что он производит, это слезы». Ли ** слезы ** рифмуются с медведями или пивом? – philshem 2014-08-07 08:31:47

ответ

43

я пропускал

l.set_option(ldap.OPT_REFERRALS, 0) 

Из инициализации.

+1

Не могу сказать, решила ли эта проблема. – 2008-09-26 16:54:03

+2

У меня была такая же проблема, и она решила это для меня. – Staale 2008-10-03 10:14:38

+3

Основной причиной этой ошибки является то, что у вас есть рефералы в начальном ответе, а код LDAP Windows не отправляет учетные данные серверу рефералов. Если вы использовали учетные данные kerberos, он должен работать. – schlenk 2009-12-17 23:04:16

1

Используйте Distinguished Name для входа в систему. "CN=Your user,CN=Users,DC=b2t,DC=local" Он должен работать в любой системе LDAP, включая AD

23

Если вы открыты для использования pywin32, вы можете использовать вызовы Win32 с Python. Это то, что мы делаем в нашем веб-сервере CherryPy:

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

Я вижу свой комментарий к @Johan Бурети о DN не фиксируя вашу проблему, но я также считаю, что это то, что вы должны смотреть.

В качестве примера DN для учетной записи администратора по умолчанию в AD будет: cn = Administrator, cn = Пользователи, dc = mydomain, dc = co, dc = uk - попробуйте это.

7

Это сработало для меня, l.set_option (ldap.OPT_REFERRALS, 0) был ключом для доступа к ActiveDirectory. Более того, я думаю, что вы должны добавить «con.unbind()», чтобы закрыть соединение до завершения скрипта.

0

Если это часть веб-сервиса, предназначенного для аутентифицированных пользователей, может представлять интерес this so question.

1

Я пытался добавить

l.set_option(ldap.OPT_REFERRALS, 0)

но вместо ошибки Python просто зависает и не реагирует ни на что больше. Возможно, я неправильно искал поисковый запрос, какова базовая часть поиска? Я использую такой же, как 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) 

Я использую LDS AD и экземпляр регистрируется для текущего счета ,

3

Если у вас установлен Kerberos и разговаривает с AD, как в случае, если, скажем, Centrify Express установлен и запущен, вы можете просто использовать python-kerberos.Например.

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

вернется Истинную в «Джо» пользователь имеет пароль «пицца» в области X.PIZZA.COM Kerberos. (обычно, я думаю, последнее будет таким же, как имя домена AD)

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

решить эту проблему.

Смежные вопросы