Django Auth LDAP - 使用sAMAccountName直接绑定

时间:2013-05-23 18:45:56

标签: python django active-directory django-authentication django-auth-ldap

使用Django Auth LDAP验证用户有两种方法

  1. 搜索/绑定和
  2. 直接绑定。
  3. 第一个涉及匿名或使用固定帐户连接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'
    

    期待来自这里的精彩人士的一些指导。

5 个答案:

答案 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"