Вопрос Есть ли способ, чтобы 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",
]