Аутентификация в active directory с помощью python + ldap
как я могу пройти проверку подлинности в 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()
работает с [email protected] password username дает мне одну из двух ошибок:
Invalid Credentials - когда я ошибаюсь или намеренно использую неправильные учетные данные, он не аутентифицируется.
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, комментарий: AcceptSecurityContext error, data 52e, vece', 'desc':'неверные учетные данные'}
или
ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, комментарий: для выполнения этой операции необходимо выполнить успешную привязку на соединении., data 0, vece', 'desc':'Operations error'}
что я упускаю, чтобы правильно связать?
Я получаю те же ошибки на Fedora и окна.
11 ответов:
Если вы открыты для использования 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 ()", чтобы закрыть соединение до завершения сценария.
если у вас установлен 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)
вот простой код, который работает для меня.
import ldap # run 'pip install python-ldap' to install ldap module. conn = ldap.open("ldaphost.company.com") conn.simple_bind_s("[email protected]", "mypassword")это основано на предыдущий ответ.
Я вижу ваш комментарий к @Johan Buret о том, что DN не исправляет вашу проблему, но я также считаю, что это то, что вы должны изучить.
учитывая ваш пример, DN для учетной записи администратора по умолчанию в AD будет: cn = администратор, cn=пользователи, dc=mydomain, dc=co, dc=uk-пожалуйста, попробуйте это.
Я пытался добавить
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)Я использую AD LDS и экземпляр зарегистрирован для текущего счета.
использовать отличительное имя для входа в систему.
"CN=Your user,CN=Users,DC=b2t,DC=local"Он должен работать на любой системе LDAP, включая AD
Если это часть веб-приложения, предназначенного для аутентифицированных пользователей ad,это так вопрос может быть интересно.
Comments