Прозрачная авторизация из AD: Sparc Solaris и Apache @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 9 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Заголовок сообщения: Прозрачная авторизация из AD: Sparc Solaris и Apache
Сообщение Добавлено: 17 Декабрь 2006, 13:53:57 
В общем такое дело... есть сервер на Solaris (Sparc), Apache 2.2 и сетка Windows 2003 AD. Есть дикое желание реализовать прозрачную авторизацию заходящих на WEB, т.к. все в домене, и требовать с пользователей имена/пароли стыдно. Кто-нибудь слышал про такое, это возможно? Но смысл авторизации не в том, чтобы пускать/непускать на WEB, а чтобы ЗНАТЬ их PHP, кто именно зашёл, т.е. сетевой логин. Т.е. требуется однозначная прозрачная идентификация входящего...
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 17 Декабрь 2006, 15:17:56 
NTLM
Fagot Муж.
новый человек
15
Сообщения: 210
Зарегистрирован: 08.04.04
Откуда: столица Сибири
Сообщение Добавлено: 18 Декабрь 2006, 10:07:47 
Crazy, угу только помнится мне ntlm совместим только с ие

_________________
Nothing Lasts... But Nothing Is Lost
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 19 Декабрь 2006, 05:54:19 
Спасибо, обрадовался было, но у меня и в IE это дело не работает... IE 6.0, Windows XP Professional. И авторизация всё равно не прозрачная, запрашивает имя и пароль. Я в домене.

_________________
Лишь одно в моём кармане - беспонтовый пирожок
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 19 Декабрь 2006, 05:55:57 
Ошибка. Работает, только если включить прокси-сервер. Без прокси - никак.

Если отключить прокси, сначала появляется запрос на авторизацию, потом - сообщение, что браузер не поддерживает NTLM. Продолжаю копать.
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 19 Декабрь 2006, 06:44:24 
Я так понимаю, что авторизация NTLM без запроса из вне невозможна. К примеру, прокси авторизует пользователя, потому в заголовке и появляется header, содержащий результаты авторизации. Следовательно, придётся ещё добавить к Apache mod_ldap, чтобы при заходе пользователя на сайт Apache авторизовала пользователя из домена, тогда и соответствующий заголовок появится. Проблема только том, что не доменные пользователи на сайт уже не зайдут.

_________________
Лишь одно в моём кармане - беспонтовый пирожок
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 19 Декабрь 2006, 07:29:56 
В общем проблему решил. Чтобы проходила NTLM авторизация, WEB-узел нужно добавить в политиках безопасности IE в местную интра-сеть.

_________________
Лишь одно в моём кармане - беспонтовый пирожок
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 19 Декабрь 2006, 12:01:03 
Скажите мне, корифеи... тут ещё один трабл нарисовался. Сама авторизация работает. Но вот теперь переменные 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 тоже нет.

_________________
Лишь одно в моём кармане - беспонтовый пирожок
Konyukhov Муж.
новый человек
0
Сообщения: 166
Зарегистрирован: 10.12.06
Откуда: 89
Сообщение Добавлено: 24 Декабрь 2006, 14:59:44 
Кому интересно, проблему решил окончательно. Ситуация такова: когда клиент проходит авторизацию NTLM в браузере, переменные пост не передаются. Для того, чтобы они передавались, нужно использовать PEAR - NTLMProxy. Это первый вариант.

Я пошёл упрощённым путём - создал ещё один виртуальный сервер ( auth.domain.com), авторизация происходит на нём, а после успешной авторизации происходит перенаправление на основной (www.domain.com), с передачей отметки об успешной авторизации в сессионную переменную.

_________________
Лишь одно в моём кармане - беспонтовый пирожок
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 9 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100