web-dev-qa-db-ja.com

Python3でユーザーをLDAP3にバインド(認証)する方法

ldap version '0.9.7.4'を使用して、一部のコードをpython3に更新しようとしています。 ( https://pypi.python.org/pypi/ldap

以前は、python2でpython-ldapを使用して、次のようにユーザーを認証していました。

import ldap
address = "ldap://Host:389"
con = ldap.initialize(address)
base_dn = "ourDN=jjj"
con.protocol_version = ldap.VERSION3
search_filter = "(uid=USERNAME)"
result = con.search_s(base_dn, ldap.SCOPE_SUBTREE, search_filter, None)  
user_dn = result[0][0]  # get the user DN
con.simple_bind_s(user_dn, "PASSWORD")

これにより、正しいパスワードで(97, [], 2, [])が適切に返され、バインド試行時に不正なパスワードを使用してldap.INVALID_CREDENTIALSが発生します。

Python3でldap3を使用して、私は次のようにしています:

from ldap3 import Server, Connection, AUTH_SIMPLE, STRATEGY_SYNC, ALL
s = Server(Host, port=389, get_info=ALL)
c = Connection(s, authentication=AUTH_SIMPLE, user=user_dn, password=PASSWORD, check_names=True, lazy=False, client_strategy=STRATEGY_SYNC, raise_exceptions=True)
c.open()
c.bind()

次の例外が発生しています。

ldap3.core.exceptions.LDAPInvalidCredentialsResult: LDAPInvalidCredentialsResult - 49 - invalidCredentials - [{'dn': '', 'message': '', 'type': 'bindResponse', 'result': 0, 'saslCreds': 'None', 'description': 'success', 'referrals': None}]

これはpython2で動作しているように見えるため、python2のldap検索で返されたuser_dn値を使用しています。

これをpython3のldap3を使用して適切にバインドするにはどうすればよいですか?

奇妙なことに、ldap3のLDAPInvalidCredentialsResultに'description': 'success'が含まれていることが1つ奇妙です。これは、応答が正常に受信されたことを意味していると思います...

11
monkut

私はldap3の作成者です。接続定義で_raise_exceptions=False_を設定し、バインド後に_connection.result_を確認してください。 bind()が失敗した理由を取得する必要があります。

22
cannatag