如何使用PHP对Windows身份验证用户进行身份验证

如何使用PHP对Windows身份验证用户进行身份验证,php,windows,iis-7,windows-authentication,Php,Windows,Iis 7,Windows Authentication,如果用户使用windows auth登录到我的站点,我如何注销该用户,以便再次对其进行身份验证?(这是针对IIS的) 例如,用户以如下方式登录: 然后,$\u服务器变量包含: [REMOTE_ADDR] => 172.34.567.891 [REMOTE_HOST] => 172.34.567.891 [REMOTE_PORT] => 44601 [REMOTE_USER] => DOMAIN\username 并且,除非计算机重新启动,或者用户使用其他浏览器,否则不

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

例如,用户以如下方式登录:

然后,
$\u服务器
变量包含:

[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之外,其他浏览器都不支持这个功能?有跨浏览器解决方案吗?

如果您使用的是带有HTTP Basic Auth的PHP,那么您需要使用和测试两个
$\u SERVER
变量:
$\u SERVER['PHP\u Auth\u USER']
$\u SERVER['PHP\u Auth\u 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身份验证类似。那么就不可能以编程方式注销。请参阅。为什么不让PHP直接与Active Directory或处理Windows身份验证的任何东西通信呢。并将其转发给用户?这就是我遇到类似问题时所做的。通过这种方式,PHP可以完全控制用户的会话。@NullUserException您做了什么?我在一家公司工作,所有用户身份验证都由Active Directory处理,因此您对所有内容都有一个用户名和密码组合。我用PHP编写了一个内部web应用程序,该应用程序使用其AD进行身份验证,但会话本身由PHP管理。@NullUserException是否有任何代码可以显示给我,或者是否都是专有的?+1了解有关将SSL与HTTP basic auth一起使用的说明。(HTTP基本身份验证以明文形式发送用户名和密码)。@RobAllen--我正在使用基于IIS Windows的身份验证,那么它还能工作吗?嗯,我不确定。我一直在我的应用程序中管理身份验证。我认为你不需要担心PHP_AUTH的东西,只需发送401即可。