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

1

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

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

  • Привязать к AD LDAP-серверу с помощью системной учетной записи, созданной для этой цели (назовите ее DOMAIN\gatekeeper)
  • Подтвердите 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?

  • 0
    Я бы порекомендовал вам пойти по маршруту Kerberos PAM. Если это для веб-сервисов, я бы рекомендовал использовать apache + mod_kerb. Затем вы можете получить единый вход для работы с согласованной аутентификацией в вашем домене Windows. Вот как я внедряю основанные на Unix веб-сервисы в своей организации.
  • 0
    Kerberos PAM auth будет работать; возможно, вы могли бы предоставить инструкции для этого? Однако Apache + mod_kerb здесь работать не будет.
Теги:
authentication
ldap
active-directory

2 ответа

1

В ваших многочисленных проблемах:

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

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

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

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню