0

我必须让用户在 Active Directory 系统上设置标志“用户必须更改密码”时更改他的密码。

当我通过我的 AD 管理员授予 adLDAP 访问权限时,这才有效。

因此,当用户尝试登录时,我会检查属性“pwdlastset”是否具有指示用户必须更改密码的值。如果是,我将他重定向到更新密码对话框。

这个解决方案的问题是,当用户输入无效的初始密码时,我也会重定向他。因为我无法验证他。当我尝试绑定用户时,设置了“pwdlastet”属性,它总是返回一个错误“无法绑定”。

$adldap = new \adLDAP(array("base_dn" => $basedn, "account_suffix" => $accsuffix,"domain_controllers" => $dc,"admin_username" => $adminuser, "admin_password" => $adminpw));        

//Get Requesting Users "pwdLastSet" Field over the Admin Account
$userToAuthInfo =  $adldap->user()->info($name,"pwdlastset");
if($userToAuthInfo[0]["pwdlastset"][0] == 0)
{
//redirect user to pwd renew
}
else
{
//bind user and redirect to home
}

有谁知道我怎么能解决这个问题?我想如果存在带有 pw 的单独属性,我可以请求它并检查它是否相同。但是当我没有错的时候,我认为这样的属性是不存在的。

4

1 回答 1

3
function userchange($username,$pwdLastSetVal,$domadlogin,$domadpw,$domctrl)
{
    $ldapServer = $domctrl;
    $ldapBase = 'OU= ,DC= ,DC= '; //be sure to set this according to your ldap settings
    $ds = ldap_connect($ldapServer);

    if (!$ds)
       die('Cannot Connect to LDAP server');

    $ldapBind = ldap_bind($ds,$domadlogin,$domadpw);
    if (!$ldapBind)
       die('Cannot Bind to LDAP server');

    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3) or die("Error setting LDAP version");

    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0) or die("Error setting referrals option");

    $attrs = array("samaccountname", "pwdlastset");
    $filter = "(samaccountname=".$username.")";
    $sr = ldap_search($ds, $ldapBase, $filter, $attrs);
    $ent= ldap_get_entries($ds,$sr);
    $dn=$ent[0]["dn"];
    $userdata=array();

    $userdata["pwdlastset"][0]=$pwdLastSetVal;

    ldap_modify($ds, $dn, $userdata); //change state

    ldap_close($ds);
}

// -1 or 0 after the username parameter
userchange($username, -1, $domadlogin, $domadpw, $domctrl);

我会在您尝试绑定用户并将其密码更改为新密码之前调用此函数并传递-1,如果绑定成功(用户提供了不正确的当前密码),然后再次调用 userchange 函数并传递 0,所以它将它设置回以前的状态,用户可以再试一次。当用户成功绑定并设置新密码后,可以调用userchange函数,在$username参数后传入-1。

于 2013-04-19T16:46:17.020 回答