1

Active Directory を使用して LDAP 経由で PHP Web アプリケーションに対してユーザーを認証しようとしています。

<?php
    $ldapconfig['host'] = 'ldapserv.xx.uni.edu';
    $ldapconfig['port'] = 389;
    $ldapconfig['basedn'] = 'dc=xx, dc=uni, dc=edu';
    $ldapconfig['authrealm'] = 'Secure Area';

    function ldap_authenticate() {
        global $ldapconfig;
        global $PHP_AUTH_USER;
        global $PHP_AUTH_PW;

        if ($PHP_AUTH_USER != "" && $PHP_AUTH_PW != "") {       
            $ds=@ldap_connect($ldapconfig['host'],$ldapconfig['port']) or exit ("Error connecting to LDAP server.");

            //Settings for AD
            ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
            ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

            $r = @ldap_search( $ds, $ldapconfig['basedn'], 'uid=' . $PHP_AUTH_USER);
            if ($r) {
                $result = @ldap_get_entries( $ds, $r);
                if ($result[0]) {
                    if (@ldap_bind( $ds, 'uni\\' . $PHP_AUTH_USER, $PHP_AUTH_PW) ) {

                        return $result[0];
                    }
                }
            }
        }
        header('WWW-Authenticate: Basic realm="'.$ldapconfig['authrealm'].'"');
        header('HTTP/1.0 401 Unauthorized');
        return NULL;
    }

    if (($result = ldap_authenticate()) == NULL) {
        echo('Authorization Failed <br />');
        exit(0);
    }
    echo('Authorization success');
    print_r($result);

?>

このコードは、ユーザーがキャンセルをクリックしない限り、ユーザー名とパスワードの入力を求め続けます。私は何を間違っていますか?

4

2 に答える 2

1

最近の PHP バージョンでは、デフォルトで $PHP_AUTH_USER 変数と $PHP_AUTH_PW 変数が提供されなくなったため、スクリプトが LDAP チェックに到達することさえありません。最後の 2 つの「グローバル」行を削除し、これらの変数を $_SERVER['PHP_AUTH_USER'] と $_SERVER['PHP_AUTH_PW'] に置き換えます。

それでも問題が解決しない場合は、@ 文字を削除して、エラーがあるかどうかを確認してください。

于 2012-06-08T10:21:26.313 に答える
0

session_registerログイン認証を(そしてはるかに単純なコードで)機能させることができました

<?php

if (isset($_POST['submitted'])) { 

    $username =$_POST['username'];
    $password=$_POST['password'];

    $ldap = ldap_connect("ldapserv.xx.uni.edu", 389) or exit ("Error connecting to LDAP server.");

    //Settings for AD
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);


    if($bind = ldap_bind($ldap, 'uni\\'.$username, $password)) {
        //Log them in!
        session_register("username");
        session_register("password");
        header("Location: https://" . $_SERVER['HTTP_HOST'] . substr($_SERVER['REQUEST_URI'], 0, -9) . "index.php" );
        exit;

    } else {

        echo('Invalid username or password.<br /><br />');
    }
}
?>
于 2012-06-08T15:30:49.460 に答える