Разрешить пользователям AD изменять свои пароли с помощью Python ldap3

Я использую Python ldap3[1] для создания API, который позволяет пользователям изменять свои пароли Microsoft Active Directory, используя свои текущие учетные данные. Вот что делает мой API:

1- Создайте соединение LDAP и привяжите его к серверу LDAP:

tls_config = Tls(validate=ssl.CERT_NONE) server = Server(ldaps_endpoint, port = 636, use_ssl = True, tls = tls_config) connection = Connection(server, user=username, password=password, authentication='NTLM') connection.bind()

2- Сменить пароль с помощью extend.microsoft.modifyPassword.ad_modify_password() Функция ldap3:

user_modified = extend.microsoft.modifyPassword.ad_modify_password(connection, user_dn, new_password, current_password)

Это прекрасно работает, когда пользовательский флаг смены пароля при следующем входе в систему не установлен. Когда он установлен, он не работает, потому что соединение не может bind(), Я пытался с помощью ANONYMOUS соединение вместо NTLM который успешно связывается. Тем не менее ad_modify_password() Функция не работает с:

Для выполнения этой операции необходимо выполнить успешное связывание на соединении

Как ad_modify_password() должен работать со сменой пароля при следующем флаге входа?

[1] https://ldap3.readthedocs.io/

1 ответ

Это не - и это не что-то особенное для Python. Microsoft поставила веб-сайт для смены пароля на основе ASP, который вы можете запустить на контроллере домена, и у сайта MS было то же ограничение. Если пароль пользователя уже истек или пользователь должен был изменить свой пароль при следующем входе в систему, вы застряли.

Два подхода:

(1) Создайте функцию самообслуживания для сброса пароля, которая аутентифицирует пользователя по чему-то другому, кроме пароля его учетной записи AD - хэшированные атрибуты, хранящиеся на объекте пользователя, вопросы о вызове / ответе, которые хранятся в таблице базы данных, и т. Д. проходит вторичную аутентификацию, учетные данные администратора используются для сброса пароля.

(2) В частности, для пользователей, которые должны изменить пароль при следующем входе в систему, атрибуту pwdLastSet будет присвоено значение "0", когда пользователь должен изменить свой пароль. Используя системные учетные данные с доступом на запись к значению, измените это значение на -1. Затем свяжите с учетной записью и паролем, предоставленным пользователем. Если привязка не удалась, установите pwdLastSet обратно на 0. Если привязка прошла, измените пароль.

# 1 - это больше времени и усилий, но он сортирует людей с устаревшими паролями, людей, которым нужно сменить пароль при следующем входе в систему, людей, которые заблокированы, и людей, которые забыли свой пароль. "Люди, которые забыли свой пароль / были заблокированы", как правило, являются большой победой - сокращение обращений в службу поддержки может компенсировать время / деньги, потраченные на разработку сброса пароля самообслуживания.

№ 2 гораздо проще, но обрабатывает только один сценарий, который вы представляете. Если для домена задан максимальный срок действия пароля (или политика детализированных паролей, которая устанавливает максимальный срок действия пароля для некоторых учетных записей пользователей), пользователи с просроченными кредитами все равно могут застрять.

Другие вопросы по тегам