6

Istnieją dwa sposoby, aby uwierzytelnić użytkownika za pomocą Django auth LDAPDjango uwierzytelniania LDAP - Bezpośrednie Bind użyciu sAMAccountName

  1. Search/bind i
  2. bezpośredni oprawę.

Pierwszy polega na łączeniu się z serwerem LDAP anonimowo lub ze stałym kontem i wyszukiwaniem nazwy wyróżniającej użytkownika uwierzytelniającego. Następnie możemy spróbować ponownie połączyć się z hasłem użytkownika.

Druga metoda polega na wyprowadzeniu nazwy DN użytkownika z jego nazwy użytkownika i podjęciu próby powiązania jako użytkownika bezpośrednio.

Chcę móc wykonać bezpośrednie powiązanie przy użyciu identyfikatora użytkownika (sAMAccountName) i hasła użytkownika, który próbuje uzyskać dostęp do aplikacji. Proszę dać mi znać, czy istnieje sposób, aby to osiągnąć? W tej chwili nie mogę wykonać tej pracy z powodu opisanego poniżej problemu.

W moim przypadku, DN użytkowników w LDAP ma następujący format

**'CN=Steven Jones,OU=Users,OU=Central,OU=US,DC=client,DC=corp'** 

Zasadniczo przekłada się na „CN = Imię Nazwisko, OU = Users, OU = Centralny, OU = US, DC = klient, DC = corp”

to pozwala mi z użyciem bezpośredniego Bind jako samAccountName użytkownika jest sjones i jest to parametr, który odpowiada nazwie użytkownika (% użytkowników) i nie mogę wymyślić sposób na oprawienie właściwego AUTH_LDAP_USER_DN_TEMPLAT E, aby uzyskać DN nazwy użytkownika za pomocą.

W związku z powyższym wyjaśnił problem, używam Search/bind do teraz, ale to wymaga mnie mieć stałą poświadczeń użytkownik może zostać określona w AUTH_LDAP_BIND_DN i AUTH_LDAP_BIND_PASSWORD.

Oto mój obecny settings.py konfiguracja

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' 

Szukasz jakiegoś wskazówek od wspaniałych ludzi tutaj do przodu.

Odpowiedz

8

Miałem ten sam problem.

Pobiegłem po drugiej stronie: https://bitbucket.org/psagers/django-auth-ldap/issue/21/cant-bind-and-search-on-activedirectory

Autor wychowany sposób na zmianę plików biblioteki dla django-auth-ldap, aby mogła ona wykonać bezpośredniego powiązania.

on zszedł do zmieniających /django_auth_ldap/backend.py obejmować dwie linie wokół linii 364:

if sticky and ldap_settings.AUTH_LDAP_USER_SEARCH: 
    self._search_for_user_dn()[/code] 

udało mi się uzyskać to do pracy na moim lokalnym macheine który został uruchomiony Arch Linux 3.9.8 -1-ARCH, ale nie mogłem go zreplikować na serwerze dev z Ubuntu 13.04.

Mam nadzieję, że to może pomóc.

+0

Dzięki @amethystdragon Wygląda, że ​​to rozwiąże mój problem. Wkrótce spróbuję. – Guddu

4

(W rzeczywistości jest to komentarz do odpowiedzi @ amethystdragon, ale jest to garść kodu, więc publikowanie jako oddzielnej odpowiedzi.) Problem nadal istnieje z django_auth_ldap 1.2.5. Oto zaktualizowana łatka. Jeśli nie chcesz lub nie możesz zmodyfikować kodu źródłowego, poprawianie małp jest możliwe. Po prostu wpisz ten kod na przykład. koniec settings.py. (I tak, wiem, małpa-łatanie jest brzydka.)

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 
+0

Wielkie dzięki. Dam to także spróbować – Guddu

0

miałem też ten problem gdzie stary serwer LDAP miał dn który rozpoczął z uid, ale DN nowym rozpoczyna CN (” Steven Jones "). Użyłem tej konfiguracji (który rozwiązać go dla mnie) w 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)') 
0

miałem też ten problem, ale nie chcę, aby zmodyfikować plik settings.py. Naprawiono dla mnie komentarz "AUTH_LDAP_USER_DN_TEMPLATE =" uid =% (użytkownik) s, ou = ścieżka, dc = do, dc = domena "". Dodałem też NestedActiveDirectoryGroupType jako część mojego rozwiązywania problemów. Nie jestem pewien, czy to konieczne, ale teraz działa, więc go opuszczam. Oto mój plik ldap_config.py.

import ldap 

# Server URI 
AUTH_LDAP_SERVER_URI = "ldap://urlForLdap" 

# The following may be needed if you are binding to Active Directory. 
AUTH_LDAP_CONNECTION_OPTIONS = { 
     # ldap.OPT_DEBUG_LEVEL: 1, 
    ldap.OPT_REFERRALS: 0 
} 

# Set the DN and password for the NetBox service account. 
AUTH_LDAP_BIND_DN = "CN=Netbox,OU=xxx,DC=xxx,DC=xxx" 
AUTH_LDAP_BIND_PASSWORD = "password" 

# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert. 
# Note that this is a NetBox-specific setting which sets: 
#  ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER) 
LDAP_IGNORE_CERT_ERRORS = True 

from django_auth_ldap.config import LDAPSearch, NestedActiveDirectoryGroupType 

# This search matches users with the sAMAccountName equal to the provided username. This is required if the user's 
# username is not in their DN (Active Directory). 
AUTH_LDAP_USER_SEARCH = LDAPSearch("OU=xxx,DC=xxx,DC=xxx", 
            ldap.SCOPE_SUBTREE, 
            "(sAMAccountName=%(user)s)") 

# If a user's DN is producible from their username, we don't need to search. 
# AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,ou=users,dc=corp,dc=loc" 

# You can map user attributes to Django attributes as so. 
AUTH_LDAP_USER_ATTR_MAP = { 
    "first_name": "givenName", 
    "last_name": "sn", 
    "email": "mail" 
} 

from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, NestedActiveDirectoryGroupType 

# This search ought to return all groups to which the user belongs. django_auth_ldap uses this to determine group 
# heirarchy. 
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("dc=xxx,dc=xxx", ldap.SCOPE_SUBTREE, 
            "(objectClass=group)") 
AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType() 

# Define a group required to login. 
AUTH_LDAP_REQUIRE_GROUP = "CN=NetBox_Users,OU=NetBox,OU=xxx,DC=xxx,DC=xxx" 

# Define special user types using groups. Exercise great caution when assigning superuser status. 
AUTH_LDAP_USER_FLAGS_BY_GROUP = { 
    "is_active": "CN=NetBox_Active,OU=NetBox,OU=xxx,DC=xxx,DC=xxx", 
    "is_staff": "CN=NetBox_Staff,OU=NetBox,OU=xxx,DC=xxx,DC=xxx", 
    "is_superuser": "CN=NetBox_Superuser,OU=NetBox,OU=xxx,DC=xxx,DC=xxx" 
} 

# For more granular permissions, we can map LDAP groups to Django groups. 
AUTH_LDAP_FIND_GROUP_PERMS = True 

# Cache groups for one hour to reduce LDAP traffic 
AUTH_LDAP_CACHE_GROUPS = True 
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600