使用Django Auth LDAP验证用户有两种方法
第一个涉及匿名或使用固定帐户连接LDAP服务器并搜索身份验证用户的可分辨名称。然后我们可以尝试再次使用用户的密码绑定。
第二种方法是从用户名中导出用户的DN并尝试直接绑定用户。
我希望能够使用尝试访问应用程序的用户的userid(sAMAccountName)和密码进行直接绑定。如果有办法实现这一点,请告诉我?目前,由于下面解释的问题,我似乎无法完成这项工作。
就我而言,LDAP中用户的DN格式如下
**'CN=Steven Jones,OU=Users,OU=Central,OU=US,DC=client,DC=corp'**
这基本上转换为'CN = FirstName LastName,OU = Users,OU = Central,OU = US,DC = client,DC = corp'
这阻止我使用Direct Bind,因为用户的 sAMAccountName 是 sjones ,这是与用户名(%user)对应的参数无法找到一种方法来构建正确的 AUTH_LDAP_USER_DN_TEMPLATE 以使用导出用户的DN。
由于上述问题,我现在使用搜索/绑定,但这需要我在 AUTH_LDAP_BIND_DN 和 AUTH_LDAP_BIND_PASSWORD 中指定固定的用户凭据。
以下是我当前的 settings.py 配置
AUTH_LDAP_SERVER_URI = "ldap://10.5.120.161:389"
AUTH_LDAP_BIND_DN='CN=Steven Jones,OU=Users,OU=Central,OU=US,DC=client,DC=corp'
AUTH_LDAP_BIND_PASSWORD='fga.1234'
#AUTH_LDAP_USER_DN_TEMPLATE = 'CN=%(user)s,OU=Appl Groups,OU=Central,OU=US,DC=client,DC=corp'
AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(
LDAPSearch("OU=Users, OU=Central,OU=US,DC=client,DC=corp",ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"),
LDAPSearch("OU=Users,OU=Regional,OU=Locales,OU=US,DC=client,DC=corp",ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)"),
)
AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn","email":"mail"}
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("CN=GG_BusinessApp_US,OU=Appl Groups,OU=Central,OU=US,DC=client,DC=corp",ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
AUTH_LDAP_REQUIRE_GROUP = 'CN=GG_BusinessApp_US,OU=Appl Groups,OU=Central,OU=US,DC=client,DC=corp'
期待来自这里的精彩人士的一些指导。
答案 0 :(得分:8)
我遇到了同样的问题。
我跑来跑去:https://bitbucket.org/psagers/django-auth-ldap/issue/21/cant-bind-and-search-on-activedirectory
作者提出了一种方法来更改django-auth-ldap的库文件,以便它可以直接绑定。
归结为更改/django_auth_ldap/backend.py以包含第364行的两行:
if sticky and ldap_settings.AUTH_LDAP_USER_SEARCH:
self._search_for_user_dn()[/code]
我能够在运行Arch Linux 3.9.8-1-ARCH的本地机器上运行,但我无法在运行Ubuntu 13.04的开发服务器上复制它。
希望这可以提供帮助。
答案 1 :(得分:5)
(这实际上是对@ amethystdragon的答案的评论,但它是一堆代码,所以发布作为一个单独的答案。)django_auth_ldap 1.2.5似乎仍然存在这个问题。这是一个更新的补丁。如果您不想或不能修改源代码,可以进行猴子修补。只需将此代码放入例如。结束settings.py
。 (是的,我知道修补猴子很难看。)
import ldap
from django_auth_ldap import backend
def monkey(self, password):
"""
Binds to the LDAP server with the user's DN and password. Raises
AuthenticationFailed on failure.
"""
if self.dn is None:
raise self.AuthenticationFailed("failed to map the username to a DN.")
try:
sticky = self.settings.BIND_AS_AUTHENTICATING_USER
self._bind_as(self.dn, password, sticky=sticky)
#### The fix -->
if sticky and self.settings.USER_SEARCH:
self._search_for_user_dn()
#### <-- The fix
except ldap.INVALID_CREDENTIALS:
raise self.AuthenticationFailed("user DN/password rejected by LDAP server.")
backend._LDAPUser._authenticate_user_dn = monkey
答案 2 :(得分:0)
我也有这个问题,旧的ldap服务器有一个以uid开头的dn,但是新的DN以CN(&#39; Steven Jones&#39;)开头。我在setting.py:
中使用了这个配置(为我解决了这个问题)AUTH_LDAP_BIND_DN = 'CN=adreader,CN=Users,DC=xxx, DC=yyy'
from django_auth_ldap.config import LDAPSearch
import ldap
AUTH_LDAP_USER_SEARCH = LDAPSearch(base_dn='ou=People, ou=xxx, dc=yyy, dc=zzz,
scope=ldap.SCOPE_SUBTREE, filterstr='(sAMAccountName=%(user)s)')
答案 3 :(得分:0)
我也有这个问题,但我不想修改mt.sql=tbl(mydb, "mt")
mt.sql %>% select(mpg, i) # e.g.
文件。对我来说,修复方法是注释掉该行&#34; AUTH_LDAP_USER_DN_TEMPLATE =&#34; uid =%(用户)s,ou = path,dc = to,dc = domain&#34;&#34;。我还添加了settings.py
作为我的问题排查的一部分。不确定是否有必要,但它现在正在工作,所以我要离开它。这是我的NestedActiveDirectoryGroupType
文件。
ldap_config.py
答案 4 :(得分:0)
我认为使用直接绑定(如下所示),然后在登录界面中传递通用名称即可完成这项工作,因此不需要设置静态身份验证凭据。
AUTH_LDAP_USER_DN_TEMPLATE = "CN=%(user)s,OU=users,OU=OR-TN,DC=OrangeTunisie,DC=intra"