我正在使用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()
应该如何与下一个登录标志上的更改密码一起使用?
答案 0 :(得分:0)
不是-这不是Python特有的。 Microsoft提供了一个可以在域控制器上运行的基于ASP的用户密码更改网站,并且MS的网站具有相同的限制。如果用户的密码已经过期,或者用户需要在下次登录时更改密码,那么您将陷入困境。
两种方法:
(1)构建自助密码重置功能,该功能可根据用户的AD帐户密码以外的其他内容对用户进行身份验证-存储在其用户对象上的哈希属性,质询/响应问题(存储在数据库表中)等。如果用户通过了辅助身份验证,则将使用管理员凭据来重置密码。
(2)特别是对于必须在下次登录时更改密码的用户,当用户必须更改其密码时,pwdLastSet属性将设置为“ 0”。使用具有“写入”值访问权限的系统凭证,将该值修改为-1。 然后与用户提供的帐户和密码绑定。如果绑定失败,则将pwdLastSet设置回0。如果绑定通过,则更改密码。
#1可以节省更多时间/精力,但是可以对密码过期的人员,需要在下次登录时更改密码的人员,被锁定的人员以及忘记密码的人员进行排序。 “忘记密码/被锁定的人”往往是一个大赢家-减少服务台呼叫可以抵消投入自助密码重置开发的时间/金钱。
#2要简单得多,但只能处理您提出的单个方案。如果为域定义了最长密码使用期限(或为某些用户帐户建立了最长密码使用期限的细粒度密码策略),则具有过期凭据的用户可能仍会卡住。