Как отменить аутентификацию пользователя Windows Auth с помощью PHP

64
3

Если пользователь зарегистрировался на моем сайте с помощью windows auth, как я могу зарегистрировать человека, чтобы он снова должен был пройти проверку подлинности? (это с IIS)


Например, пользователь регистрируется следующим образом:


auth


Затем переменная $_SERVER содержит:


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

И пользователь не запрашивает его имя пользователя или пароль с помощью auth windows, если компьютер не перезагружен, или он использует другой браузер.


Как я могу заставить повторить проверку подлинности пользователя с помощью PHP?


Обновление:


Я нашел способ сделать это, но он работает только в хроме (все другие браузеры просто бросают 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? Существует ли кросс-браузерное решение?

спросил(а) 2012-04-03T22:26:00+04:00 8 лет, 2 месяца назад
1
Решение
54

Если вы используете 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 тоже!)

ответил(а) 2012-04-11T09:02:00+04:00 8 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема