Может ли django_auth_ldap BIND_AS_AUTHENTICATING_USER, используя имя пользователя, получить имя пользователя Distin guish Name? - PullRequest
0 голосов
/ 07 января 2020

Вопрос Есть ли способ, чтобы LDAPSearch использовал учетную запись Bind аутентифицированного пользователя, чтобы получить отличительное имя из ActiveDirectory и использовать его для поиска группы?

Проблема : При связывании и аутентификации в качестве идентификатора пользователя в домене, а затем при попытке выполнить поиск группы LDAP (в Active Directory) требуется переменная, содержащая различающееся имя аутентифицированного пользователя, которое будет предоставлено LDAPSearch.

Описание: Поиск группы LDAP требует, чтобы в LDAPSearch было указано отличительное имя пользователя при использовании django -auth-ldap для Active Directory с

AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = True

и войдите в систему, используя Userid@domain в качестве формата

переменная% (user) s, похоже, является данными, используемыми LDAPSearch, что в данном случае является userid@domain чем Отличительное имя аутентифицированного пользователя.

Вывод с консоли Django в разработке указывает успешное связывание с Active Directory, когда появляется текст Заполнение Django пользователь , тогда ошибка LDAP указывает на неправильное отличительное имя при попытке без полного имени пользователя в поиске.

Запуск сервера разработки в http://127.0.0.1: 8000 /

Выйти из сервера с помощью CONTROL- C.

Заполнение Django user testuser

search_s ('testuser@test.local', 0, '(objectClass = *)')

поднято INVALID_DN_SYNTAX ({'des c': 'Неверный синтаксис DN', 'информация': "0000208F: NameErr: DSID-03100225, проблема 2006 (BAD_NAME), данные 8350, наилучшее совпадение: \ n \ t 'testuser@test.local' \ n "},)

Версии программного обеспечения

Python 3.6.3, Django 3.0.1, django -auth-ldap 2.1.0

settings.py

from os import environ, path
import ldap
from django_auth_ldap.config import LDAPSearch, LDAPGroupQuery, NestedActiveDirectoryGroupType

AUTH_LDAP_SERVER_URI = environ.get("LDAP_HOST")
AUTH_LDAP_ALWAYS_UPDATE_USER = True
# Tack on the domain name to userid, allows log in to require just the userid.
AUTH_LDAP_USER_DN_TEMPLATE='%(user)s@test.local'
AUTH_LDAP_BIND_AS_AUTHENTICATING_USER=True
AUTH_LDAP_PERMIT_EMPTY_PASSWORD = False
AUTH_LDAP_CONNECTION_OPTIONS = {
    ldap.OPT_DEBUG_LEVEL: 1,
    ldap.OPT_REFERRALS: 0,
}

# Set up the basic group parameters.
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("dc=test,dc=local", ldap.SCOPE_SUBTREE, "(objectClass=*)")
AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType(name_attr="cn")

# Allow only members of this group to login
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    "is_active": (
        LDAPGroupQuery(f"cn=users,cn=builtin," + environ.get("LDAP_GROUP_SEARCH"))
    ),
    "is_staff": (
        LDAPGroupQuery("cn=staff,ou=groups," + environ.get("LDAP_GROUP_SEARCH"))
        | LDAPGroupQuery("cn=users," + environ.get("LDAP_GROUP_SEARCH"))
        | LDAPGroupQuery("cn=domain admins,cn=users," + environ.get("LDAP_GROUP_SEARCH"))
    ),
    "is_superuser": (
        LDAPGroupQuery("cn=administrators,cn=builtin," + environ.get("LDAP_GROUP_SEARCH"))
        | LDAPGroupQuery("cn=domain admins,cn=users," + environ.get("LDAP_GROUP_SEARCH"))
    ),
}

AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn", "email": "mail"}

AUTHENTICATION_BACKENDS = [
    "django_auth_ldap.backend.LDAPBackend",
    "django.contrib.auth.backends.ModelBackend",
]
...