当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用python+ldap对活动目录进行身份验证》经验,为你挑选了4个好方法。

如何使用Python + LDAP对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会给我两个错误之一:

Invalid Credentials - 当我输入错误或故意使用错误的凭据时,它无法进行身份验证.

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

要么

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

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

我在fedora和windows上遇到了同样的错误.



1> 1729..:

我失踪了

l.set_option(ldap.OPT_REFERRALS, 0)

从init.


此错误的根本原因是您在初始响应中有引用,并且Windows LDAP代码不会将凭据发送到引用服务器.如果您使用了kerberos凭证,它应该可以使用.
我有同样的问题,它为我解决了它.
我有不同的症状,但同样的选择解决了我的问题.在博客文章中总结:http://www.chaverma.com/blog/index.php/2013/06/python-ldap-functions-run-forever-against-activedirectory/

2> davidavr..:

如果您愿意使用pywin32,则可以使用Python的Win32调用.这就是我们在CherryPy Web服务器中所做的事情:

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


简单干净!谢谢!

3> alfredocambe..:

这对我有用,l.set_option(ldap.OPT_REFERRALS,0)是访问ActiveDirectory的关键.此外,我认为你应该添加一个"con.unbind()",以便在完成脚本之前关闭连接.


来自[python-ldap文档](http://www.python-ldap.org/doc/html/ldap.html):``LDAPObject`的实例由`initialize()`返回.删除LDAP对象时,连接将自动解除绑定并关闭.

4> JohnMudd..:

这是一些对我有用的简单代码。

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")

这是基于先前的答案。

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有