Python + LDAPを使用してActive Directoryに対して認証する


89

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、次の2つのエラーのいずれかが発生します。

Invalid Credentials -誤って入力したり、意図的に間違った資格情報を使用したりすると、認証に失敗します。

ldap.INVALID_CREDENTIALS:{'info': '80090308:LdapErr:DSID-0C090334、comment:AcceptSecurityContext error、data 52e、vece'、 'desc': 'Invalid credentials'}

または

ldap.OPERATIONS_ERROR:{'info': '00000000:LdapErr:DSID-0C090627、Comment:この操作を実行するには、接続でバインドを正常に完了する必要があります。、データ0、vece'、 'desc': '操作エラー'}

適切にバインドするために何を逃していますか?

fedoraとwindowsで同じエラーが発生します。


2
「……そしてそれが生み出しているのは涙だけだ」ん涙がクマやビールと韻?
philshem 2014

回答:


47

私は行方不明でした

l.set_option(ldap.OPT_REFERRALS, 0)

初期から。


3
このバグの根本的な原因は、最初の応答に紹介があり、Windows LDAPコードが紹介サーバーに認証情報を送信しないことです。Kerberos資格情報を使用している場合は、機能するはずです。
シュレンク2009

2
別の症状がありましたが、この同じオプションで問題が解決しました。ブログの記事でそれを要約:chaverma.com/blog/index.php/2013/06/...
クリス・

関連しているかどうかはわかりませんが、同じ問題があり、1729の解決策は何かをしたようです-しかし、LDAPサーバーがINVALID CREDENTIALSにすぐに応答する場合もあります。しばらくすると落ち着いて再び動きます。
Nitay、2014年

28

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
シンプルできれい!ありがとう!
alexroat 2013年

このソリューションは、制限付きのNTLM企業プロキシの背後にあるPython Flaskアプリケーションで機能しました。他のいくつかのLDAPベースのオプションは単に機能しません。
ギガフロップ、

7

それは私にとってはうまくいきました、l.set_option(ldap.OPT_REFERRALS、0)はActiveDirectoryにアクセスするためのキーでした。さらに、スクリプトを終了する前に接続を閉じるために、「con.unbind()」を追加する必要があると思います。


8
以下からのpython-LDAPのドキュメント:のインスタンスは、LDAPObjectによって返されますinitialize()。LDAPオブジェクトが削除されると、接続は自動的にバインド解除されて閉じられます。
セーレンLøvborg

接続ではなく、セッションを閉じます。
Romulus

5

ここに私のために働くいくつかの簡単なコードがあります。

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

これは以前の回答に基づいています


1
これはもう機能しません。受信しますAttributeError: module 'ldap' has no attribute 'open'
Josh Correia

3

たとえば、Centrify Expressがインストールされて実行されている場合のように、KerberosがインストールされてADと通信している場合は、python-kerberosを使用するだけです。例えば

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

KerberosレルムX.PIZZA.COMでユーザー 'joe'のパスワード 'pizza'がTrueを返します。(通常、後者はADドメインの名前と同じになると思います)


2

DNが問題を修正していないことについて@Johan Buretへのコメントを読んでいますが、それも調査する必要があると思います。

あなたの例では、ADのデフォルトの管理者アカウントのDNは次のようになります:cn = Administrator、cn = Users、dc = mydomain、dc = co、dc = uk-試してください。


2

優れた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と互換性があるはずです。


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を使用していますが、インスタンスは現在のアカウントに登録されています。


1

私は同じ問題を抱えていましたが、それはパスワードのエンコーディングに関するものでした

.encode('iso-8859-1')

問題を解決しました。


0

識別名を使用してシステムにログオンします。"CN=Your user,CN=Users,DC=b2t,DC=local" ADを含むすべてのLDAPシステムで動作するはずです。


0

からsimple_bind_s()に変更してbind()、トリックを行いました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.