簡體   English   中英

使用python + ldap對活動目錄進行身份驗證

[英]Authenticating against active directory using python + ldap

如何使用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運行此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上遇到了同樣的錯誤。

我失蹤了

l.set_option(ldap.OPT_REFERRALS, 0)

從init。

如果您願意使用pywin32,則可以使用Python的Win32調用。 這就是我們在CherryPy Web服務器中所做的事情:

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()”,以便在完成腳本之前關閉連接。

這里有一些適合我的簡單代碼。

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

這是基於之前的答案

如果您安裝了Kerberos並與AD通信,例如安裝和運行Centrify Express的情況,您可能只使用python-kerberos。 例如

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

將返回True用戶'joe'在Kerberos領域X.PIZZA.COM中有密碼'pizza'。 (通常,我認為,后者與AD域的名稱相同)

我看到你對@Johan Buret的評論關於DN沒有解決你的問題,但我也相信這是你應該研究的。

舉個例子,AD中默認管理員帳戶的DN將是:cn = Administrator,cn = Users,dc = mydomain,dc = co,dc = uk - 請試試。

我有同樣的問題,但它是關於密碼編碼

.encode('iso-8859-1')

解決了這個問題。

我試着補充一下

l.set_option(ldap.OPT_REFERRALS,0)

但不是錯誤Python只是掛起而不再響應任何東西。 也許我正在構建錯誤的搜索查詢,搜索的基本部分是什么? 我使用與簡單綁定相同的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,並且該實例已在當前帳戶中注冊。

基於優秀的ldap3教程

>>> from ldap3 import Server, Connection, ALL, NTLM
>>> server = Server('server_name_or_ip', get_info=ALL)
>>> conn = Connection(server, user="user_name", password="password", auto_bind=True)
>>> conn.extend.standard.who_am_i()
>>> server.info

我在Python3中做了以上操作,但它應該與Python 2兼容。

使用專有名稱登錄系統。 "CN=Your user,CN=Users,DC=b2t,DC=local"它應該適用於任何LDAP系統,包括AD

對我來說,從simple_bind_s()更改為bind()就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM