使用python + ldap对活动目录进行身份validation

我如何使用Python + LDAP对AD进行身份validation。 我目前正在使用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运行这个给我两个错误之一:

Invalid Credentials – 当我错误input或故意使用错误凭证时,无法进行身份validation。

ldap.INVALID_CREDENTIALS:{'info':'80090308:LdapErr:DSID-0C090334,评论:AcceptSecurityContext错误,数据52e,vece','desc':'凭据无效}}

要么

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

我错过了什么来正确绑定?

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

我错过了

 l.set_option(ldap.OPT_REFERRALS, 0) 

从init。

如果您打算使用pywin32,则可以使用Python中的Win32调用。 这就是我们在CherryPynetworking服务器上所做的:

 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()”以在完成脚本之前closures连接。

如果您安装了Kerberos并与AD交谈(例如Centrify Express已经安装并运行),则可以使用python-kerberos。 例如

 import kerberos kerberos.checkPassword('joe','pizza','krbtgt/x.pizza.com','X.PIZZA.COM')` 

将在Kerberos域X.PIZZA.COM中返回True用户'joe'具有密码'pizza'。 (通常,我认为后者将与AD域名相同)

这里有一些简单的代码适用于我。

 import ldap # run 'pip install python-ldap' to install ldap module. conn = ldap.open("ldaphost.company.com") conn.simple_bind_s("myuser@company.com", "mypassword") 

这是基于以前的答案 。

我看到你对@Johan Buret的评论关于DN没有解决你的问题,但我也相信这是你应该看看。

以您的示例为例,AD中默认pipe理员帐户的DN将为:cn = Administrator,cn = Users,dc = mydomain,dc = co,dc = uk – 请尝试。

使用专有名称login您的系统。 "CN=Your user,CN=Users,DC=b2t,DC=local"它应该适用于任何LDAP系统,包括AD

我试图添加

l.set_option(ldap.OPT_REFERRALS,0)

但不是一个错误Python只是挂起,不会再有任何反应。 也许我正在build立search查询错误,什么是search的基本部分? 我使用相同的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,实例已注册为当前帐户。

我有同样的问题,但它是关于密码编码

 .encode('iso-8859-1') 

解决问题。

如果这是用于authentication的广告用户的webapp的一部分, 那么这个问题可能是有趣的。

对于我从simple_bind_s()更改为bind()做了诀窍。