Как я могу сделать двухэтапную аутентификацию на сервере Active Directory в Python? - PullRequest
1 голос
/ 24 августа 2010

Я использую Python 2.6 на компьютере с FreeBSD, и я хотел бы сделать (и я не знаю правильный термин для этого) двухэтапную аутентификацию для активного каталога.

По сути, процесс входа в систему пользователя 'myuserid':

  1. Привязка к серверу AD LDAP с использованием системной учетной записи, созданной для этой цели (назовите ее DOMAIN\gatekeeper)
  2. Проверьте пароль myuserid для учетных данных, хранящихся в AD для этого пользователя.

У меня есть следующий код, который очень похож на код в этот вопрос .

l = ldap.initialize(Server)
l.protoco_version = 3
l.set_option(ldap.OPT_REFERRALS, 0)
l.simple_bind_s('cn=gatekeeper,dc=DOMAIN,dc=COMPANY,dc=TLD', 'gatekeeper_password')

Последнее приводит к этой ошибке:

=> LDAPError - INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 525, vece', 'desc': 'Invalid credentials'}
---------------------------------------------------------------------------
INVALID_CREDENTIALS                       Traceback (most recent call last)

/Users/crose/projects/ldap-auth/9163_saas/webservices/aws/model/aw_registry/<ipython console> in <module>()

/Users/crose/virtualenv/ldap-auth/lib/python2.6/site-packages/ldap/ldapobject.pyc in simple_bind_s(self, who, cred, serverctrls, clientctrls)
    205     """
    206     msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
--> 207     return self.result(msgid,all=1,timeout=self.timeout)
    208 
    209   def bind(self,who,cred,method=ldap.AUTH_SIMPLE):

/Users/crose/virtualenv/ldap-auth/lib/python2.6/site-packages/ldap/ldapobject.pyc in result(self, msgid, all, timeout)
    420         polling (timeout = 0), in which case (None, None) is returned.
    421     """
--> 422     res_type,res_data,res_msgid = self.result2(msgid,all,timeout)
    423     return res_type,res_data
    424 

/Users/crose/virtualenv/ldap-auth/lib/python2.6/site-packages/ldap/ldapobject.pyc in result2(self, msgid, all, timeout)
    424 
    425   def result2(self,msgid=ldap.RES_ANY,all=1,timeout=None):
--> 426     res_type, res_data, res_msgid, srv_ctrls = self.result3(msgid,all,timeout)
    427     return res_type, res_data, res_msgid
    428  

/Users/crose/virtualenv/ldap-auth/lib/python2.6/site-packages/ldap/ldapobject.pyc in result3(self, msgid, all, timeout)
    430     if timeout is None:
    431       timeout = self.timeout
--> 432     ldap_result = self._ldap_call(self._l.result3,msgid,all,timeout)
    433     if ldap_result is None:
    434       rtype, rdata, rmsgid, decoded_serverctrls = (None,None,None,None)

/Users/crose/virtualenv/ldap-auth/lib/python2.6/site-packages/ldap/ldapobject.pyc in _ldap_call(self, func, *args, **kwargs)
     94     try:
     95       try:
---> 96         result = func(*args,**kwargs)
     97         if __debug__ and self._trace_level>=2:
     98           if func.__name__!="unbind_ext":

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

Кажется, что все учебники, которые я вижу, предполагают, что я работаю на Windows, а это не так. Как мне это сделать из Unix?

Ответы [ 2 ]

1 голос
/ 06 января 2011

У вас там несколько проблем:

  1. SIMPLE Auth без SSL обычно отключается на AD (и даже версия SSL часто отключена)
  2. SIMPLE Auth на самом деле не указываеткодирование пароля (обычно работает utf-8)
  3. SIMPLE Auth может вызвать проблемы с рефералами
  4. Ваш пользователь AD, вероятно, имеет другой CN, когда его Gatekeeper \ DOMAIN, обычно это что-то вроде cn = Gatekeeper, dc = Пользователи, dc = DOMAIN, dc = COMPANY, dc = TLD или около того (имя гейткипера взято из свойства sAMAccountName, cn может быть совершенно не связан ...)

Так что обычно вынужно сделать по крайней мере эти вещи, чтобы заставить его работать:

  • Убедитесь, что ваша AD принимает ПРОСТУЮ аутентификацию вообще
  • Свяжите с вашей учетной записью привратника и найдите DN для имени пользователя вAD (обычно путем поиска чего-то вроде sAMAccountName или userPrincipalName)
  • Попробуйте связать найденное DN с паролем, предоставленным пользователем
  • Если связывание завершится успешно, yoвы можете обращаться с пользователем как с аутентифицированным ...

Но если вам это далеко не так много работы, вместо этого использовать PAM или Kerberos.

0 голосов
/ 24 августа 2010

Ошибка возврата LDAP 49 с субкодом 525 - это не плохой пароль, а скорее неправильный DN связывания 52e плохие полномочия. Убедитесь, что у вас есть правильное DN пользователя-привратника.

...