6

का उपयोग कर रहे का उपयोग कर Django प्रमाणीकरण LDAPDjango प्रमाणीकरण एलडीएपी - प्रत्यक्ष बाइंड sAMAccountName

  1. खोज/बाइंड और
  2. प्रत्यक्ष बाइंड एक उपयोगकर्ता को प्रमाणित करने के लिए दो तरीके हैं।

पहला व्यक्ति एलडीएपी सर्वर से गुमनाम रूप से या एक निश्चित खाते से कनेक्ट हो रहा है और प्रमाणीकरण उपयोगकर्ता के विशिष्ट नाम की खोज कर रहा है। फिर हम उपयोगकर्ता के पासवर्ड से फिर से बांधने का प्रयास कर सकते हैं।

दूसरा तरीका उपयोगकर्ता के डीएन को अपने उपयोगकर्ता नाम से प्राप्त करना है और उपयोगकर्ता को सीधे बाध्य करने का प्रयास करना है।

मैं उपयोगकर्ता आईडी (sAMAccountName) और उपयोगकर्ता के पासवर्ड का उपयोग कर सीधे बाध्य करने में सक्षम होना चाहता हूं जो एप्लिकेशन तक पहुंच प्राप्त करने का प्रयास कर रहा है। अगर यह हासिल करने का कोई तरीका है तो कृपया मुझे बताएं? फिलहाल, मैं नीचे बताई गई समस्या के कारण यह काम नहीं कर सकता।

मेरे मामले में, LDAP में उपयोगकर्ताओं का डी एन निम्न स्वरूप

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

यह मूलतः 'सीएन = प्रथम नाम अंतिम नाम, OU = उपयोगकर्ता, OU करने के लिए अनुवाद की है = मध्य, OU = अमेरिका, डीसी = ग्राहक, डीसी = कॉर्प '

यह sjones प्रत्यक्ष बाइंड sAMAccountName उपयोगकर्ता की के रूप में उपयोग करने से मुझे रोक रहा है और इस पैरामीटर है कि उपयोगकर्ता नाम (% उपयोगकर्ता) से मेल खाती है और मैं नहीं कर सकता उचित AUTH_LDAP_USER_DN_TEMPLAT को फ्रेम करने का तरीका निकालें उपयोगकर्ता के डीएन का उपयोग करने के लिए ई

ऊपर बताया गया है समस्या के कारण, मैं खोज/बाइंड उपयोग कर रहा हूँ अब के लिए, लेकिन यह मुझे एक निश्चित उपयोगकर्ता क्रेडेंशियल 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' 

यहाँ में अद्भुत लोगों से कुछ मार्गदर्शन के लिए आगे देख रहे हैं।

उत्तर

8

मुझे एक ही समस्या थी।

मैं करवाते भाग गया: https://bitbucket.org/psagers/django-auth-ldap/issue/21/cant-bind-and-search-on-activedirectory

लेखक Django लेखन-ldap के लिए पुस्तकालय फ़ाइलों को बदलने के लिए इतना है कि यह एक सीधा बाँध कर सकता है एक तरह से पाला।

यह /django_auth_ldap/backend.py बदलते लाइन 364 के आसपास दो पंक्तियों को शामिल करने के लिए नीचे आया:

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

मैं इस अपने स्थानीय macheine पर काम शुरू कर पा रहा था कि आर्क लिनक्स 3.9.8 चल रहा था -1-आर्क, लेकिन मैं इसे उबंटू 13.04 चलाने वाले देव सर्वर पर दोहराने में असमर्थ था।

उम्मीद है कि इससे मदद मिल सकती है।

+0

धन्यवाद @amethystdragon ऐसा लगता है कि यह मेरी समस्या का समाधान करेगा। मैं इसे जल्द ही कोशिश करूंगा। – Guddu

4

(यह वास्तव में @ एमेथिस्ट्रैगन के उत्तर पर एक टिप्पणी है, लेकिन यह कोड का एक गुच्छा है, इसलिए एक अलग उत्तर के रूप में पोस्ट करना।) समस्या अभी भी 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 
+0

बहुत बहुत धन्यवाद। मैं इसे भी कोशिश करूंगा – Guddu

0

मैं भी इस समस्या को जहां वर्ष LDAP सर्वर एक dn कि यूआईडी के साथ शुरू किया था, लेकिन नया एक के डी एन सीएन साथ शुरू होता है (' स्टीवन जोन्स ')। मैं इस विन्यास 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

मैं भी इस मुद्दे को नहीं था, लेकिन मैं settings.py फ़ाइल को संशोधित करने के लिए नहीं चाहता था। मेरे लिए फिक्स "AUTH_LDAP_USER_DN_TEMPLATE =" uid =% (उपयोगकर्ता) s, ou = path, dc = to, dc = डोमेन "पंक्ति को टिप्पणी करना था। मैंने अपनी समस्या निवारण के हिस्से के रूप में NestedActiveDirectoryGroupType भी जोड़ा। यह सुनिश्चित नहीं है कि यह आवश्यक है, लेकिन अब यह काम कर रहा है इसलिए मैं इसे छोड़ रहा हूं। यहां मेरी 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 
संबंधित मुद्दे