2016-09-05 14 views
0

誰かがPHP LDAP Active Directoryを手伝うことができるのだろうかと思っていました。PHP LDAP Password_ExpireとAccount_Lockを確認する

現在、Scott Barnettが作成したPHP LDAPクラス& Richard Hyland(http://adldap.sourceforge.net/)バージョン4.0.4を使用しています。

ログインは問題ありません。ユーザーが誤ってパスワードを入力しすぎた場合、アカウントはActive Directoryによって設定されたとおりにロックされます。

問題は、ユーザーが自分のアカウントをロックした日時と、30日後にパスワードの有効期限が切れたときに、それぞれのシナリオを外部ユーザーのために別のページにリダイレクトする必要があると判断しようとしていることです。今

通常、次のコードでは、ユーザーのログが実行されます。

include (dirname(__FILE__) . "./adLDAP/src/adLDAP.php"); 
try 
{ 
    $adldap = new adLDAP(); 
} 
catch (adLDAPException $e) 
{ 
    echo $e; 
    exit(); 
} 
if ($adldap->authenticate($username, $password)) 
{ 
    //establish your session and redirect 
    session_start(); 
    $_SESSION["username"] = $username; 
    $_SESSION["userinfo"] = $adldap->user()->info($username); 
    $redir = "Location: https://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "user_page.php"; 
    header($redir); 
    exit; 
} 

adLDAP.phpにこのコードへのリンクは、ADへの接続を作成し、ユーザーを認証し、それらをログに記録し

adLDAPUsers.phpクラス内には、ユーザーのパスワードが期限切れかどうかを判断するために使用されるはずのpublic function "passwordExpiry($ username、$ isGUID = false)"がありますが、この関数を取得するのに苦労しています次の行を実行するときのように動作します。

if (!$this->adldap->getLdapBind()) { return false; } 

常にFALSEを返します。ユーザーの正しい資格情報でADに接続することはできず、コードの残りの部分はパスワードの有効期限を決めるために決して実行されません。私のメインのログインページから

私は、次のコードを持っている:

if (!$adldap->checkAccPassExp($username)) 
{ 
    $redir = "Location: https://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "changepassword.php"; 
    header($redir); 
    exit; 
} 

それは、その後adLDAP.phpへのリンクを:今度は、その後adLDAPUsers.phpクラスにリンクし、実行

public function checkAccPassExp($username, $password) 
{ 
    $PassExpire = $this->user()->passwordExpiry($username, $isGUID); 
} 

コード。

ユーザーのアカウントがロックされているかどうかを決定するためとして、徹底的な機能が実際に存在しないクラスの中にいる、ただ保護機能を決定:

protected function accountControl($options) 
{ 
$val=0; 
if (is_array($options)) { 
if (in_array("SCRIPT",$options)){ $val=$val+1; } 
if (in_array("ACCOUNTDISABLE",$options)){ $val=$val+2; } 
if (in_array("HOMEDIR_REQUIRED",$options)){ $val=$val+8; } 
if (in_array("LOCKOUT",$options)){ $val=$val+16; } 
if (in_array("PASSWD_NOTREQD",$options)){ $val=$val+32; } 
//PASSWD_CANT_CHANGE Note You cannot assign this permission by directly modifying the UserAccountControl attribute. 
//For information about how to set the permission programmatically, see the "Property flag descriptions" section. 
if (in_array("ENCRYPTED_TEXT_PWD_ALLOWED",$options)){ $val=$val+128; } 
if (in_array("TEMP_DUPLICATE_ACCOUNT",$options)){ $val=$val+256; } 
if (in_array("NORMAL_ACCOUNT",$options)){ $val=$val+512; } 
if (in_array("INTERDOMAIN_TRUST_ACCOUNT",$options)){ $val=$val+2048; } 
if (in_array("WORKSTATION_TRUST_ACCOUNT",$options)){ $val=$val+4096; } 
if (in_array("SERVER_TRUST_ACCOUNT",$options)){ $val=$val+8192; } 
if (in_array("DONT_EXPIRE_PASSWORD",$options)){ $val=$val+65536; } 
if (in_array("MNS_LOGON_ACCOUNT",$options)){ $val=$val+131072; } 
if (in_array("SMARTCARD_REQUIRED",$options)){ $val=$val+262144; } 
if (in_array("TRUSTED_FOR_DELEGATION",$options)){ $val=$val+524288; } 
if (in_array("NOT_DELEGATED",$options)){ $val=$val+1048576; } 
if (in_array("USE_DES_KEY_ONLY",$options)){ $val=$val+2097152; } 
if (in_array("DONT_REQ_PREAUTH",$options)){ $val=$val+4194304; } 
if (in_array("PASSWORD_EXPIRED",$options)){ $val=$val+8388608; } 
if (in_array("TRUSTED_TO_AUTH_FOR_DELEGATION",$options)){val=$val+16777216; } 
} 
return $val; 
} 

私はからコピーしなければならなかった今、このコードadLDAP.phpファイルにクラスとそれが保護された関数であり、私は他の方法、それを呼び出すことができないだろうと、このような呼び出し:何がユーザーのアカウントに問題がある場合

public function checkAccLocked() 
{ 
    $options = array("LOCKOUT"); 
    $userlocked[0] = $this->accountControl($options); 
    if ($userlocked[0] == 16) 
    { 
     $ret = false; 
    } 
    else 
    { 
     $ret = true; 
    } 
    return $ret; 
} 

は、今私は、決定しました、任意の値を$ optionsに送ることができます。対応する値、すなわち私のユーザのパスワードは期限切れになる可能性がありますが、関数から任意の変数を呼び出すことができ、単にpassword_expireの値ではなく値を返します。

LDAPWiki(https://ldapwiki.com/wiki/Common%20Active%20Directory%20Bind%20Errors)では、LDAPコード49が非常に多くの値を返すので、LDAPコードは役に立たないことがわかりました。1907 -

コード - ERROR_PASSWORD_EXPIRED や コードのための1330:私は多分コードが、私はエラー番号を取得できるようになることを期待していたし、私は正しい方向にユーザーを指すことができますが、私は十進コードが必要になりますERROR_PASSWORD_MUST_CHANGEの と コード - 1909(ERROR_ACCOUNT_LOCKED_OUT)

これまでにこのコードを使用したことがありますか?誰かがどこのコードを使用するのか、そしてこれをどのように利用するのかについて助けてください。そうでない場合は、使用する必要がある他のコードがありますか?

答えて

0

少なくとも2つの異なる方法から2つの条件を判断する必要があります。 Password_Expiredは、パスワードの有効期限が切れている状態です。 Microsoft Active Directoryの場合、標準的な記述があります。

Account_lockは、アカウントが管理上ロックされているか、アカウントが侵入者検出によってロックされている場所です。

0

あなたはこのような関数を使用して、失敗した認証/バインド後に探している拡張エラーコードを取得することができます:

function getExtendedErrorNumber($adLdap) 
{ 
    $errorNumber = 0; 

    ldap_get_option($adLdap->getLdapConnection(), LDAP_OPT_ERROR_STRING, $extendedError); 
    if (!empty($extendedError) && preg_match('/, data (\d+),?/', $extendedError, $matches)) { 
     $errorNumber = hexdec(intval($matches[1])); 
    } 

    return $errorNumber; 
} 

が好き、それを使用します。

const PWD_EXPIRED = 1330; 
const PWD_MUST_CHANGE = 1907; 
const ACCOUNT_LOCKED = 1909; 
const ACCOUNT_DISABLED = 1331; 

$errorNumber = getExtendedErrorNumber($adldap); 


// The account password has expired 
if ($errorNumber === PWD_EXPIRED) { 

// The user must change their password before they can login 
} elseif ($errorNumber === PWD_MUST_CHANGE) { 

// The user's account is locked 
} elseif ($errorNumber === ACCOUNT_LOCKED) { 

// The user's account is disabled 
} elseif ($errorNumber === ACCOUNT_DISABLED) { 

} 

サイドノートを:あなたが使用しているadLdapライブラリは、もはや維持されていません。 AdLdap2またはLdapToolsにアップグレードすることをお勧めします。

関連する問題