6

Có hai cách để xác thực người dùng sử dụng Django Auth LDAPDjango Auth LDAP - Bind trực tiếp sử dụng sAMAccountName

  1. Tìm kiếm/Bind và
  2. Direct Bind.

Điều đầu tiên liên quan đến việc kết nối với máy chủ LDAP ẩn danh hoặc với tài khoản cố định và tìm kiếm tên phân biệt của người dùng xác thực. Sau đó, chúng tôi có thể cố gắng liên kết lại với mật khẩu của người dùng.

Phương pháp thứ hai là lấy DN của người dùng từ tên người dùng của anh ấy và cố gắng ràng buộc trực tiếp với người dùng.

Tôi muốn có thể thực hiện liên kết trực tiếp bằng userid (sAMAccountName) và mật khẩu của người dùng đang cố truy cập vào ứng dụng. Xin vui lòng cho tôi biết nếu có một cách để đạt được điều này? Hiện tại, tôi dường như không thể thực hiện công việc này do vấn đề được giải thích bên dưới.

Trong trường hợp của tôi, các DN của người dùng trong LDAP là định dạng sau

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

này về cơ bản dịch để 'CN = FirstName LastName, OU = Users, OU = Trung ương, OU = US, DC = khách hàng, DC = corp'

Đây là ngăn chặn tôi từ việc sử dụng trực tiếp Bind như sAMAccountName của người sử dụng được sjones và đây là thông số tương ứng với tên người dùng (% người dùng) và tôi không thể tìm ra cách để tạo khung thích hợp AUTH_LDAP_USER_DN_TEMPLAT E để lấy DN của người dùng sử dụng.

Do vấn đề giải thích ở trên, tôi đang sử dụng Tìm kiếm/Bind cho bây giờ nhưng điều này đòi hỏi tôi phải có một chứng chỉ người dùng cố định được quy định tại AUTH_LDAP_BIND_DNAUTH_LDAP_BIND_PASSWORD.

Đây là hiện tại của tôi settings.py cấu hình

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' 

Mong cho một số hướng dẫn từ các folks tuyệt vời tại đây.

Trả lời

8

Tôi gặp vấn đề tương tự.

Tôi chạy accross: https://bitbucket.org/psagers/django-auth-ldap/issue/21/cant-bind-and-search-on-activedirectory

Tác giả đưa ra một cách để thay đổi các tập tin thư viện cho django-auth-ldap để nó có thể làm một ràng buộc trực tiếp.

Nó đi xuống thay đổi /django_auth_ldap/backend.py bao gồm hai dòng xung quanh dòng 364:

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

tôi đã có thể có được điều này để làm việc trên macheine địa phương của tôi đang chạy Arch Linux 3.9.8 -1-ARCH, nhưng tôi đã không thể tái tạo nó trên máy chủ dev chạy Ubuntu 13.04.

Hy vọng điều này có thể hữu ích.

+0

Cảm ơn @amethystdragon Có vẻ như điều này sẽ giải quyết được vấn đề của tôi. Tôi sẽ thử ngay thôi. – Guddu

4

(Đây thực sự là nhận xét về câu trả lời của @ amethystdragon, nhưng đó là một loạt mã, vì vậy hãy đăng bài dưới dạng câu trả lời riêng biệt). Vấn đề vẫn tồn tại với django_auth_ldap 1.2.5. Đây là một bản vá cập nhật. Nếu bạn không muốn hoặc không thể sửa đổi mã nguồn, bạn có thể vá khỉ. Chỉ cần đặt mã này vào ví dụ. kết thúc của settings.py. (Và vâng, tôi biết khỉ vá là xấu xí.)

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

Cảm ơn rất nhiều. Tôi cũng sẽ thử – Guddu

0

Tôi cũng có vấn đề này mà máy chủ ldap cũ đã có một dn mà bắt đầu với uid, nhưng DN của một mới bắt đầu với CN (' Steven Jones '). Tôi sử dụng cấu hình này (mà giải quyết nó cho tôi) trong 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

Tôi cũng đã có vấn đề này, nhưng tôi không muốn thay đổi các tập tin settings.py. Sửa chữa cho tôi là để bình luận ra dòng "AUTH_LDAP_USER_DN_TEMPLATE =" uid =% (người dùng) s, ou = đường dẫn, dc = đến, dc = miền "". Tôi cũng đã thêm NestedActiveDirectoryGroupType như một phần của sự cố của tôi. Không chắc chắn nếu nó là cần thiết, nhưng nó làm việc bây giờ vì vậy tôi rời khỏi nó. Đây là tập tin ldap_config.py của tôi.

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 
Các vấn đề liên quan