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

允许广告用户使用Python ldap3更改自己的密码,python,active-directory,ldap,ldap3,Python,Active Directory,Ldap,Ldap3,我正在使用Python ldap3[1]构建一个API,允许用户使用其当前凭据更改其Microsoft Active Directory密码。 这就是我的API所做的: 1-创建LDAP连接并绑定到LDAP服务器: tls\u config=tls(validate=ssl.CERT\u NONE) 服务器=服务器(ldaps\U端点,端口=636,使用\U ssl=True,tls=tls\U配置) 连接=连接(服务器,用户=用户名,密码=密码,身份验证='NTLM') connection.

我正在使用Python ldap3[1]构建一个API,允许用户使用其当前凭据更改其Microsoft Active Directory密码。 这就是我的API所做的:

1-创建LDAP连接并绑定到LDAP服务器:

tls\u config=tls(validate=ssl.CERT\u NONE)
服务器=服务器(ldaps\U端点,端口=636,使用\U ssl=True,tls=tls\U配置)
连接=连接(服务器,用户=用户名,密码=密码,身份验证='NTLM')
connection.bind()

2-使用
extend.microsoft.modifyPassword.ad\u modify\u password()
ldap3函数更改密码:

user\u modified=extend.microsoft.modifyPassword.ad\u modify\u password(连接、用户dn、新密码、当前密码)

如果未设置“下次登录时更改密码”用户标志,则此操作正常。设置后,由于连接无法绑定(),因此无法工作。我尝试使用
匿名连接,而不是成功绑定的
NTLM
。但是,
ad\u modify\u password()
功能失败,原因如下:

要执行此操作,必须在连接上成功完成绑定

ad\u modify\u password()
如何在下次登录时更改密码标志

[1]

它不是——这对Python来说也不是什么特别的东西。微软提供了一个基于ASP的用户密码更改网站,你可以在域控制器上运行,微软的网站也有同样的限制。如果用户的密码已经过期,或者用户需要在下次登录时更改密码,则您将被卡住

两种方法:

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

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

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


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

谢谢LisaJ。实际上,您可以使用RDWeb角色附带的Microsoft密码重置工具来实现这一点。在Windows Server 2016上试用:```安装WindowsFeature RDS Web访问-IncludeAllSubFeature$configFile=“C:\Windows\Web\RDWeb\Pages\Web.config”(获取内容$configFile)-替换'key=“PasswordChangeEnabled”value=“false”,'key=“PasswordChangeEnabled”value=“true”“| Out File$configFile-Force``我认为它之所以有效,是因为该工具使用Kerberos,而我在LDAPS上使用NTLMv2。我将不再进一步调查这个问题,而是坚持使用这个工具。