php - PHP - LDAP 在不使用管理员帐户的情况下更改 Active Directory 中的用户密码
问题描述
我正在构建一个使用 LDAP 针对 MS Active Directory 进行身份验证的应用程序。我们有用户密码过期的密码策略。
如何在 PHP 中通过 ldap 在不使用 AD 管理员的情况下设置用户密码?
我见过很多方法,但它们都使用管理员帐户,从我的角度来看这是一个安全风险。
解决方案
该属性的文档unicodePwd
描述了两种更改密码的方法:
- 在同一个 LDAP 请求中发送“删除”和“添加”操作。这使用旧密码作为更改密码的授权。如果用户在 Windows 中执行 Ctrl+Alt+Del -> Change password,这就是用户通常会自己做的事情。
- 发送“替换”操作,与管理员重置密码相同。这要求您已经使用有权重置密码的帐户进行身份验证。
如果我理解正确,你想避免选项 2。所以诀窍是在同一个请求中发送“添加”和“删除”请求。为此,您可以使用ldap_modify_batch
. 事实上,在文档页面本身就有一个例子:
<?php
function adifyPw($pw)
{
return iconv("UTF-8", "UTF-16LE", '"' . $pw . '"');
}
$dn = "cn=Jack Smith-Jones,ou=Wizards,dc=ad,dc=example,dc=com";
$modifs = [
[
"attrib" => "unicodePwd",
"modtype" => LDAP_MODIFY_BATCH_REMOVE,
"values" => [adifyPw("Tr0ub4dor&3")],
],
[
"attrib" => "unicodePwd",
"modtype" => LDAP_MODIFY_BATCH_ADD,
"values" => [adifyPw("correct horse battery staple")],
],
];
ldap_modify_batch($connection, $dn, $modifs);
请注意,您可能必须通过安全连接(LDAPS,通常在端口 636 上)进行连接,以便 AD 允许这样做。
推荐阅读
- java - 无法解决 Android Studio 中的符号 jetbrains 错误
- c# - 如何在 C# 中更改 DNS IP 地址
- javascript - 获取 Discord Avatar + 用户名并将其发布在网站上?
- html - mega可以用作html的图像服务器吗?
- laravel - Laravel 护照跳过 redirect_uri 验证
- python - 索引错误:Python
- python - 从多个外部列表有条件地将列值插入到 Pandas Dataframe
- python - 何时评估函数参数?
- python - 仅从文件路径中安全地提取目录路径,如果在 python 中不存在则创建目录
- c++ - C ++如何删除带有数组中类指针的类并使数组[num]为nullptr?