gpt4 book ai didi

python - 如何在 Python 中对 Active Directory 服务器进行两阶段身份验证?

转载 作者:太空宇宙 更新时间:2023-11-03 19:35:58 26 4
gpt4 key购买 nike

我在 FreeBSD 机器上运行 Python 2.6,我想对事件目录进行两阶段身份验证(我不知道正确的术语)。

基本上,登录用户“myuserid”的过程是:

  1. 使用为此目的创建的系统帐户绑定(bind)到 AD LDAP 服务器(将其称为 DOMAIN\gatekeeper)
  2. 根据 AD 中存储的该用户的凭据验证 myuserid 的密码。

我有以下代码,它看起来很像 this question 中的代码.

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 上执行此操作?

最佳答案

您在那里遇到了多种麻烦:

  1. 不带 SSL 的 SIMPLE Auth 通常在 AD 上处于禁用状态(甚至 SSL 版本也经常处于关闭状态)
  2. SIMPLE Auth 并未真正指定密码编码(通常可以使用 utf-8)
  3. SIMPLE Auth 可能会给推荐带来麻烦
  4. 您的 AD 用户在其 Gatekeeper\DOMAIN 时可能有不同的 CN,通常是其类似于 cn=Gatekeeper,dc=Users,dc=DOMAIN,dc=COMPANY,dc=TLD 等(Gatekeepername 来自 sAMAccountName 属性,cn 可能完全不相关...)

因此,通常您至少需要执行以下操作才能使其正常工作:

  • 确保您的广告完全接受简单例份验证
  • 与您的网守帐户绑定(bind)并在 AD 中查找用户名的 DN(通常通过搜索 sAMAccountName 或 userPrincipalName 等内容)
  • 尝试使用用户提供的密码绑定(bind)到您找到的 DN
  • 如果绑定(bind)成功,您可以将用户视为已通过身份验证...

但是如果您已经做到了这一点,那么使用 PAM 或 Kerberos 就不需要做更多的工作了。

关于python - 如何在 Python 中对 Active Directory 服务器进行两阶段身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com