2

如果用户使用 windows auth 登录到我的站点,我如何注销该人以便他们必须再次进行身份验证?(这是使用 IIS)

例如,用户这样登录:

授权

然后$_SERVER变量包含:

[REMOTE_ADDR] => 172.34.567.891
[REMOTE_HOST] => 172.34.567.891
[REMOTE_PORT] => 44601
[REMOTE_USER] => DOMAIN\username

除非计算机重新启动,或者他使用不同的浏览器,否则不会再次要求用户使用 Windows auth 输入他的用户名或密码。

如何强制用户再次使用 PHP 进行身份验证?


更新:

我找到了一种方法来做到这一点,但它只适用于 chrome (所有其他浏览器只会抛出 401 未经授权,即使登录是正确的):

我的代码:

logout.php

    //clear session
    //then:
    $user = isset($_SESSION['userName']);
    $userNotSet = (!$user || (is_array($user) && count($user) == 0));
    
    
    if(!isset($_SESSION['401']) && $userNotSet) {
        $_SESSION['401'] = true;
        $realm = 'mysite';
        header('HTTP/1.1 401 Unauthorized');
        header('WWW-Authenticate: Digest realm="'.$realm.
           '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
        exit;
    }
    elseif($userNotSet) {
        header('HTTP/1.1 401 Unauthorized');
        list($domain, $user) = explode("\\", $_SERVER['REMOTE_USER']);
        $_SESSION['userName'] = $user;
        $_SESSION['LoggedIn'] = true;
    }
    else    {
        header('Location: '.WEBROOT.INDEX);
    }
    exit;

为什么这在 Chrome 之外的任何其他浏览器中都不起作用?有没有跨浏览器的解决方案?

4

1 回答 1

1

如果您使用带有 HTTP Basic Auth 的 PHP,那么$_SERVER您需要使用和测试两个变量:$_SERVER['PHP_AUTH_USER']& $_SERVER['PHP_AUTH_PW']

要强制显示浏览器的 HTTP 基本身份验证登录对话框,请发送 401 标头。不管用户是否登录,您都可以随时发送 401 标头来强制用户重新输入他们的凭据。

此代码显示了基础知识:

<?php

// If the force_login request variable exists, then we want the user to
// re-enter their login details.
if (isset($_GET['force_login']) && $_GET['force_login'] == 1) {
    header('WWW-Authenticate: Basic realm="realm"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    exit;
}

// Login process
if (!$_SERVER['PHP_AUTH_USER']) {
    // The browser has not supplied $_SERVER['PHP_AUTH_USER'], so we need 
    // the user to log in 
    header('WWW-Authenticate: Basic realm="realm"'); 
    header('HTTP/1.0 401 Unauthorized'); 
    exit;

} else {
    // Test that the username/password combination are correct
    $expectedUsername = 'test';
    $expectedPassword = '1234';
    if ($_SERVER['PHP_AUTH_USER'] != $expectedUsername 
            && $_SERVER['PHP_AUTH_PW'] != $expectedPassword ) { 
        // not valid username/password - try again!
        header('WWW-Authenticate: Basic realm="realm"'); 
        header('HTTP/1.0 401 Unauthorized'); 
        exit;
    }
} 
// End login process


// The user is logged in here. we can display the page content
echo '<a href="?force_login=1">Force login</a>';

(附带说明,如果您使用的是 HTTP 基本身份验证,请确保您也使用 SSL!)

于 2012-04-11T06:02:38.890 回答