Скажите мне, корифеи... тут ещё один трабл нарисовался. Сама авторизация работает. Но вот теперь переменные POST в скрипты не передаются. Привожу всю схему для ясности...
1. Индексный файл сайта
Код:
ob_start('gz_handler');
session_start();
// ПОПЫТКА АВТОРИЗАЦИИ ПО NTLM
if ( !isset($_SESSION['auth']) )
{
header("LOCATION: /auth_ntlm.php");
exit;
}
2. Собственно сама авторизация (
auth_ntlm.php)
Код:
session_start();
$_SESSION['auth'] = 'no';
$headers = apache_request_headers(); // получаем все заголовки клиента
if (!isset($headers['Authorization'])) { // если заголовка авторизации нет
header('HTTP/1.0 401 Unauthorized'); // требуем от клиента авторизации
header('WWW-Authenticate: NTLM'); // тип требуемой авторизации - NTLM
exit; // завершаем выполнение скрипта
}
if ( substr($headers['Authorization'],0,5) == 'NTLM ' )
{
$chain = base64_decode(substr($headers['Authorization'],5)); // получаем декодированное значение
switch (ord($chain{8}))
{
case 3:
foreach (array('LM_resp','NT_resp','domain','user','host') as $k=>$v)
{
extract(unpack('vlength/voffset',substr($chain,$k*8+14,4)));
$val = substr($chain,$offset,$length);
if ( $v == 'user' )
{
$_SESSION['auth'] = 'yes';
$_SESSION['ldap_user'] = $k<2 ? hex_dump($val) : iconv('UTF-16LE','CP1251',$val);
// include( $_SERVER['DOCUMENT_ROOT'].'/auth_ldap.php' );
header("LOCATION: /");
exit;
}
}
exit;
case 1:
if (ord($chain{13}) == 0xB2)
{
$chain = "NTLMSSP\x00".
"\x02" /* номер этапа */ ."\x00\x00\x00\x00\x00\x00\x00".
"\x28\x00"."\x00\x00"."\x01\x82"."\x00\x00"."\x00\x02\x02\x02\x00\x00\x00\x00".
"\x00\x00\x00\x00\x00\x00\x00\x00";
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: NTLM '.base64_encode($chain));
exit;
}
}
}
Всё это замечательно работает. Но в скрипты переменные POST не передаются. Т.е. если с главной страницы с формы отправляешь переменные в скрипт, к примеру, post.php, то в нём ни $_POST, ни $_HTTP_POST_VARS, ни $_REQUEST... коментишь указанные мною строчки в примере 1 - всё снова передаётся. Да, $_SESSION тоже нет.