允许AD用户使用Python ldap3更改自己的密码

时间:2018-09-21 05:19:18

标签: python active-directory ldap ldap3

我正在使用Python ldap3 [1]构建一个API,该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 个答案:

答案 0 :(得分:0)

不是-这不是Python特有的。 Microsoft提供了一个可以在域控制器上运行的基于ASP的用户密码更改网站,并且MS的网站具有相同的限制。如果用户的密码已经过期,或者用户需要在下次登录时更改密码,那么您将陷入困境。

两种方法:

(1)构建自助密码重置功能,该功能可根据用户的AD帐户密码以外的其他内容对用户进行身份验证-存储在其用户对象上的哈希属性,质询/响应问题(存储在数据库表中)等。如果用户通过了辅助身份验证,则将使用管理员凭据来重置密码。

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

#1可以节省更多时间/精力,但是可以对密码过期的人员,需要在下次登录时更改密码的人员,被锁定的人员以及忘记密码的人员进行排序。 “忘记密码/被锁定的人”往往是一个大赢家-减少服务台呼叫可以抵消投入自助密码重置开发的时间/金钱。

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