Django Auth LDAP-прямая привязка с использованием sAMAccountName
существует два способа аутентификации пользователя с помощью Django Auth LDAP
- Поиск / привязка и
- Прямой Привязки.
первый включает в себя подключение к серверу LDAP анонимно или с фиксированной учетной записью и поиск отличительного имени аутентифицирующего пользователя. Затем мы можем попытаться связать снова с паролем пользователя.
второй способ-вывести DN пользователя из его имени пользователя и попытаться bind как пользователь напрямую.
Я хочу иметь возможность выполнять прямую привязку, используя идентификатор пользователя (sAMAccountName) и пароль пользователя, который пытается получить доступ к приложению. Пожалуйста, дайте мне знать, если есть способ достичь этого? На данный момент я не могу сделать эту работу из-за проблемы, описанной ниже.
в моем случае, DN пользователей в LDAP имеет следующий формат:
**'CN=Steven Jones,OU=Users,OU=Central,OU=US,DC=client,DC=corp'**
это в основном переводится как ' CN=FirstName Фамилия,ou=пользователи,ОУ=Центральный,ОУ=США,округ Колумбия=клиент,ДЦ=корпорацию'
это мешает мне использовать Direct Bind как sAMAccountName пользователя sjones и это параметр, соответствующий имени пользователя (%user), и я не могу понять, как создать правильный AUTH_LDAP_USER_DN_TEMPLATE для получения DN пользователя с помощью.
из-за вышеописанной проблемы я использую Search/Bind сейчас, но это требует от меня укажите фиксированные учетные данные пользователя в 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'
С нетерпением ждем некоторых указаний от замечательных людей здесь.
4 ответов
У меня была та же проблема.
Я побежал через: https://bitbucket.org/psagers/django-auth-ldap/issue/21/cant-bind-and-search-on-activedirectory
автор предложил способ изменить файлы библиотеки для django-auth-ldap, чтобы он мог выполнять прямую привязку.
дело дошло до изменения /django_auth_ldap/backend.py чтобы включить две строки вокруг строки 364:
if sticky and ldap_settings.AUTH_LDAP_USER_SEARCH:
self._search_for_user_dn()[/code]
я смог заставить это работать на моем местном macheine, что был запущен Arch Linux 3.9.8-1-ARCH, но я не смог реплицировать его на dev-сервере под управлением Ubuntu 13.04.
надеюсь, это может помочь.
(на самом деле это комментарий к ответу @amethystdragon, но это куча кода, поэтому публикация в качестве отдельного ответа.) Проблема по-прежнему существует с 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
У меня также была эта проблема, когда старый сервер ldap имел dn, который начинался с uid, но DN нового начинается с CN ('Steven Jones'). Я использовал эту конфигурацию (которая решила ее для меня) в 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)')
у меня также была эта проблема, но я не хотел изменять . Исправление для меня состояло в том, чтобы прокомментировать строку "AUTH_LDAP_USER_DN_TEMPLATE =" uid=%(user) s,ou=path,dc=to,dc=domain"". Я также добавил NestedActiveDirectoryGroupType
как часть моего устранения неполадок. Не уверен, что это необходимо, но сейчас это работает, поэтому я оставляю его. Вот мой .
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