切换到LDAPS后,django-auth-ldap无法将用户名映射到DN

时间:2019-12-02 08:57:13

标签: django ssl ldap django-auth-ldap

我正在为我的公司构建一个django项目,当我只使用不带SSL的简单绑定时,我的设置如下所示:

AUTH_LDAP_SERVER_URI = 'ldap://some.example.server:389'
AUTH_LDAP_BASE_DN = 'some-base-dn'
AUTH_LDAP_BIND_DN = 'some-bind-dn'
AUTH_LDAP_BIND_PASSWORD = 'some-password'
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    AUTH_LDAP_BASE_DN, ldap.SCOPE_SUBTREE, '(sAMAccountName=%(user)s)')

效果很好。

但是,由于我们公司LDAP服务器的安全性得到了增强,因此我们要求使用基于SSL的LDAP。所以我得到了证书,并像这样更改代码:

AUTH_LDAP_GLOBAL_OPTIONS = {
    ldap.OPT_X_TLS_REQUIRE_CERT: True,
    ldap.OPT_X_TLS_DEMAND: True,
    ldap.OPT_REFERRALS: 0,
    ldap.OPT_X_TLS_CACERTFILE: '/etc/ssl/certs/mycertfile.pem'
}
AUTH_LDAP_SERVER_URI = 'ldaps://some.example.server:636'
AUTH_LDAP_BASE_DN = 'some-base-dn'
AUTH_LDAP_BIND_DN = 'some-bind-dn'
AUTH_LDAP_BIND_PASSWORD = 'some-password'
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    AUTH_LDAP_BASE_DN, ldap.SCOPE_SUBTREE, '(sAMAccountName=%(user)s)')

它不再起作用。它一直说search_s(xxx)返回了0个对象:身份验证失败:未能将用户名映射到DN。

但是,如果我更改LDAPSearch()的过滤器字符串,则从

'(sAMAccountName=%(user)s)'

'(sAMAccountName=<hard-coded-id>)'

有效。

我一直在试图找出原因,到目前为止还没有运气。有谁知道为什么会这样?

非常感谢。

1 个答案:

答案 0 :(得分:0)

抱歉,这是用户错误。下面的代码运行完美。

AUTH_LDAP_GLOBAL_OPTIONS = {
    ldap.OPT_X_TLS_REQUIRE_CERT: True,
    ldap.OPT_X_TLS_DEMAND: True,
    ldap.OPT_REFERRALS: 0,
    ldap.OPT_X_TLS_CACERTFILE: '/etc/ssl/certs/mycertfile.pem'
}
AUTH_LDAP_SERVER_URI = 'ldaps://some.example.server:636'
AUTH_LDAP_BASE_DN = 'some-base-dn'
AUTH_LDAP_BIND_DN = 'some-bind-dn'
AUTH_LDAP_BIND_PASSWORD = 'some-password'
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    AUTH_LDAP_BASE_DN, ldap.SCOPE_SUBTREE, '(sAMAccountName=%(user)s)')