2

我正在使用 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/

4

1 回答 1

0

它不是——这不是 Python 特有的东西。Microsoft 提供了一个基于 ASP 的用户密码更改网站,您可以在域控制器上运行,MS 的网站也有同样的限制。如果用户的密码已经过期,或者用户需要在下次登录时更改他们的密码,你就会被卡住。

两种方法:

(1) 构建自助密码重置功能,根据 AD 帐户密码以外的其他内容对用户进行身份验证——存储在用户对象上的散列属性、存储在数据库表中的质询/响应问题等。提供用户通过二次认证,管理员凭证用于重置密码。

(2) 特别是对于下次登录时必须更改密码的用户,当用户必须更改其密码时,pwdLastSet 属性将设置为“0”。使用对该值具有“写入”访问权限的系统凭据,将该值修改为 -1。然后与用户提供的帐户和密码绑定。如果绑定失败,将 pwdLastSet 设置回 0。如果绑定通过,请更改密码。

#1 需要更多的时间/精力,但会对密码过期的人、下次登录时需要更改密码的人、被锁定的人以及忘记密码的人进行分类。“忘记密码/被锁定的人”往往是最大的赢家——减少帮助台电话可以抵消用于自助密码重置开发的时间/金钱。

#2 要简单得多,但只处理您呈现的单个场景。如果为域定义了最大密码使用期限(或为某些用户帐户建立最大密码使用期限的细粒度密码策略),则凭据过期的用户可能仍会被卡住。

于 2018-09-28T15:16:58.907 回答