如果用户使用Windows身份验证登录我的网站,如何将该人员记录下来,以便他们必须再次进行身份验证? (这是IIS)
例如,用户以这样的方式登录:
然后$_SERVER
变量包含:
[REMOTE_ADDR] => 172.34.567.891
[REMOTE_HOST] => 172.34.567.891
[REMOTE_PORT] => 44601
[REMOTE_USER] => DOMAIN\username
除非重新启动计算机或使用其他浏览器,否则不会再次询问用户使用Windows身份验证的用户名或密码。
如何强制用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之外,为什么这不适用于任何其他浏览器?是否有跨浏览器解决方案?
答案 0 :(得分:1)
如果您使用PHP与HTTP Basic Auth,那么您需要使用和测试两个$_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!)