使用Python和LDAP对Active Directory进行身份验证

100 投票
12 回答
115625 浏览
提问于 2025-04-11 09:19

我想用Python和LDAP来对Active Directory(AD)进行身份验证。目前我在用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()

当我用myusername@mydomain.co.uk password username来运行时,会出现两种错误中的一种:

无效的凭证 - 当我输入错误的用户名或故意使用错误的凭证时,它就无法通过身份验证。

ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece', 'desc': '无效的凭证'}

或者

ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, comment: 为了执行此操作,必须在连接上成功绑定。, data 0, vece', 'desc': '操作错误'}

我在绑定时到底缺少了什么呢?

我在Fedora和Windows上都遇到了同样的错误。

12 个回答

7

这个方法对我有效,l.set_option(ldap.OPT_REFERRALS, 0) 是访问ActiveDirectory的关键。此外,我觉得你应该在脚本结束前加一个“con.unbind()”,这样可以在结束之前关闭连接。

34

如果你愿意使用pywin32这个库,你可以在Python中调用Windows的功能。这就是我们在CherryPy网络服务器中所做的事情:

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

我缺少了

l.set_option(ldap.OPT_REFERRALS, 0)

从初始化那里。

撰写回答