За последние 24 часа нас посетили 22757 программистов и 1268 роботов. Сейчас ищут 720 программистов ...

NTLM + PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем murcom, 9 авг 2006.

  1. murcom

    murcom Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    62
    Симпатии:
    0
    Адрес:
    :адуктО
  2. murcom

    murcom Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    62
    Симпатии:
    0
    Адрес:
    :адуктО
    И еще вопрос. Можно ли с помощью такой авторизации узнать группу к которой принадлежит пользователь?
     
  3. murcom

    murcom Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    62
    Симпатии:
    0
    Адрес:
    :адуктО
    Поставим вопрос по другому: Как можно авторизоваться с помощью NTLM? Примеры???
     
  4. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    Код (Text):
    1. <?php
    2.  
    3. /***********************************************************************
    4. *    PHP NTLM GET LOGIN  
    5. *    Version 0.2
    6. * ====================================================  
    7. *                                        
    8. * Copyright (c) 2004 Nicolas GOLLET (Nicolas.gollet@secusquad.com)
    9. * Copyright (c) 2004 Flextronics Saint-Etienne
    10. *
    11. * This program is free software. You can redistribute it and/or modify  
    12. * it under the terms of the GNU General Public License as published by  
    13. * the Free Software Foundation; either version 2 of the License.          
    14. *
    15. ***********************************************************************/
    16.  
    17.  
    18. /*
    19. L'identification par NTLM se fait en 6 etape :
    20.  
    21. etape: | type:      | Info echange
    22. -------|----------------|--------------------------------------------------
    23.     1   | C --> S       | GET ...                               legende : C = Client
    24. -------|----------------|--------------------------------------------------                     S = Serveur
    25.     2   | C <-- S   | 401 Unauthorized
    26.          |              | WWW-Authenticate: NTLM
    27. -------|----------------|--------------------------------------------------
    28.     3   | C --> S       | GET ...
    29.          |              | Authorization: NTLM <base64-encoded type-1-message>
    30. -------|----------------|--------------------------------------------------
    31.     4   | C <-- S   | 401 Unauthorized
    32.          |              | WWW-Authenticate: NTLM <base64-encoded type-2-message>
    33. -------|----------------|--------------------------------------------------
    34.     5   | C --> S       | GET ...
    35.          |              | Authorization: NTLM <base64-encoded type-3-message>
    36. -------|----------------|--------------------------------------------------  
    37.     6   | C <-- S        | 200 Ok
    38. -------|----------------|--------------------------------------------------
    39.  
    40. */
    41.  
    42.  
    43.  
    44. $headers = apache_request_headers();    // Recuperation des l'entetes client
    45.      
    46.  
    47. if($headers['Authorization'] == NULL){              //si l'entete autorisation est inexistante
    48.     header( "HTTP/1.0 401 Unauthorized" );          //envoi au client le mode d'identification
    49.     header( "WWW-Authenticate: NTLM" );         //dans notre cas le NTLM
    50.     exit;                           //on quitte
    51.  
    52. };
    53.  
    54. if(isset($headers['Authorization']))                //dans le cas d'une authorisation (identification)
    55. {        
    56.     if(substr($headers['Authorization'],0,5) == 'NTLM '){   // on verifit que le client soit en NTLM
    57.      
    58.      
    59.         $chaine=$headers['Authorization'];                  
    60.         $chaine=substr($chaine, 5);             // recuperation du base64-encoded type1 message
    61.         $chained64=base64_decode($chaine);      // decodage base64 dans $chained64
    62.          
    63.         if(ord($chained64{8}) == 1){                    
    64.         //          |_ byte signifiant l'etape du processus d'identification (etape 3)      
    65.      
    66.         // verification du drapeau NTLM "0xb2" a l'offset 13 dans le message type-1-message :
    67.         if (ord($chained64[13]) != 178){
    68.         echo "Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci";
    69.         exit;
    70.         }
    71.             $retAuth = "NTLMSSP";                    
    72.             $retAuth .= chr(0);                  
    73.             $retAuth .= chr(2);
    74.             $retAuth .= chr(0);
    75.             $retAuth .= chr(0);
    76.             $retAuth .= chr(0);
    77.             $retAuth .= chr(0);
    78.             $retAuth .= chr(0);
    79.             $retAuth .= chr(0);
    80.             $retAuth .= chr(0);
    81.             $retAuth .= chr(40);
    82.             $retAuth .= chr(0);
    83.             $retAuth .= chr(0);
    84.             $retAuth .= chr(0);
    85.             $retAuth .= chr(1);
    86.             $retAuth .= chr(130);
    87.             $retAuth .= chr(0);
    88.             $retAuth .= chr(0);
    89.             $retAuth .= chr(0);
    90.             $retAuth .= chr(2);
    91.             $retAuth .= chr(2);
    92.             $retAuth .= chr(2);
    93.             $retAuth .= chr(0);
    94.             $retAuth .= chr(0);
    95.             $retAuth .= chr(0);
    96.             $retAuth .= chr(0);
    97.             $retAuth .= chr(0);
    98.             $retAuth .= chr(0);
    99.             $retAuth .= chr(0);
    100.             $retAuth .= chr(0);
    101.             $retAuth .= chr(0);
    102.             $retAuth .= chr(0);
    103.             $retAuth .= chr(0);
    104.             $retAuth .= chr(0);
    105.              
    106.             $retAuth64 =base64_encode($retAuth);        // encode en base64
    107.             $retAuth64 = trim($retAuth64);          // enleve les espaces de debut et de fin
    108.             header( "HTTP/1.0 401 Unauthorized" );      // envoi le nouveau header
    109.             header( "WWW-Authenticate: NTLM $retAuth64" );  // avec l'identification supplementaire
    110.             exit;
    111.              
    112.         }
    113.  
    114.         else if(ord($chained64{8}) == 3){
    115.         //               |_ byte signifiant l'etape du processus d'identification (etape 5)
    116.      
    117.         // on recupere le domaine
    118.          
    119.         $lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain
    120.         $offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain.    
    121.         $domain = substr($chained64, $offset_domain, $lenght_domain); // decoupage du du domain
    122.          
    123.         //le login
    124.         $lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login.
    125.         $offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login.
    126.         $login = substr($chained64, $offset_login, $lenght_login); // decoupage du login
    127.          
    128.         // l'host    
    129.         $lenght_host = (ord($chained64[47])*256 + ord($chained64[46])); // longueur de l'host.
    130.         $offset_host = (ord($chained64[49])*256 + ord($chained64[48])); // position de l'host.  
    131.         $host = substr($chained64, $offset_host, $lenght_host); // decoupage du l'host  
    132.          
    133.          
    134.  
    135.         echo "Domain is  : $domain";
    136.         echo "<br>Login is : $login";
    137.         echo "<br>host is  : $host";
    138.          
    139.         }
    140.  
    141.     }
    142.  
    143. }
    144.  
    145.  
    146. ?>
    Взято с phpclub.ru
     
  5. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    У меня Type 1 message приходит с флагами 0x078208a2
    и по этой причине не проходит проверка на "0xb2"
    PHP:
    1. if (ord($chained64[13]) != 178)
    И соответственно дальше сообщение
    Вот список флагов, если ничего не напутал:

    • 0x00000001 Negotiate Unicode | Indicates that Unicode strings are supported for use in security buffer data.
      0x00000002 Negotiate OEM | Indicates that OEM strings are supported for use in security buffer data.
      0x00000004 Request Target | Requests that the server's authentication realm be included in the Type 2 message.
      0x00000200 Negotiate NTLM | Indicates that NTLM authentication is being used.
      0x00008000 Negotiate Always Sign | Indicates that authenticated communication between the client and server should be signed with a "dummy" signature.
      0x00080000 Negotiate NTLM2 Key | Indicates that the NTLM2 signing and sealing scheme should be used for protecting authenticated communications. Note that this refers to a particular session security scheme, and is not related to the use of NTLMv2 authentication. This flag can, however, have an effect on the response calculations (as detailed in the "NTLM2 Session Response" section).
      0x20000000 Negotiate 128 | Indicates that 128-bit encryption is supported.
      0x80000000 Negotiate 56 | Indicates that 56-bit encryption is supported

    По идее не хватает:

    • 0x00001000 Negotiate Domain Supplied | Sent by the client in the Type 1 message to indicate that the name of the domain in which the client workstation has membership is included in the message. This is used by the server to determine whether the client is eligible for local authentication.
      0x00002000 Negotiate Workstation Supplied | Sent by the client in the Type 1 message to indicate that the client workstation's name is included in the message. This is used by the server to determine whether the client is eligible for local authentication.
    На данный момент я не совсем понимаю что необходимо для получения этих флагов. :(
    Кто что подскажет :?:
     
  6. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    Занимательно то, что если в IE security выставить опцию "Automatic logon with current username and password" то приходят те два недостающих флага, а если происходит запрос пароля/логина, то все слетает.
    Но ведь каждого пользователя не заставить включать опцию именно в это положение :(
     
  7. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    Похоже, что единственный вариант добавить узел в Trusted sites и убедиться, что там выбрана эта опция. (мне не особо нравится данное решение, но время не позволяет долго копаться в этой проблеме).
     
  8. denisKa

    denisKa Активный пользователь

    С нами с:
    4 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Здравствуйте! Снова хочу вернуться к теме NTLM.

    ОС: ASPLinux
    Apache/2.2.6
    mod_ntlm-0.4

    В настройках ОС семейства Unix не силён, поэтому помогали.
    Модуль mod_ntlm ставили ручками. Как это происходило мне неведомо. :(

    1. На странице http://www.lissyara.su/?id=1510&commented=1 указано как можно проверить работу модуля mod_ntlm из командной строки.

    Как мне сказали технические сотрудники компании по сетям у них PDC-хост - это "PDC.office.COMPANY.ru" . Заглавными буквами изменённые значения. Я полагаю, что "PDC" в "PDC.office.COMPANY.ru" это и есть "ТОЛЬКО_ИМЯ_ХОСТА_PDC".

    Ввожу (естественно сменив на реальные значения)
    ответ
    Что это может значить?

    2. Прописал в httpd.conf
    Заглавными буквами изменённые значения.
    Полное имя домена: office.COMPANY.ru
    PDC: PDC.office.COMPANY.ru
    BDC: BDC.office.COMPANY.ru

    Соответственно, я прописал
    ДОМЕН -> office.COMPANY.ru
    ТОЛЬКО_ИМЯ_ХОСТА_PDC -> PDC
    ТОЛЬКО_ИМЯ_ХОСТА_BDC -> BDC

    В файл index.php в директории /test/ вставил код, указанный выше.

    При открытии выводится окно ввода логина и пароля. Пароль и логин не принимает и выводит 401-ю ошибку (Authorization Required).

    Вот заголовки:
    Вот что написано в error.log Apache:
    И ещё не могу прописать WEB-узел (192.168.100.120) в зону "Местная интрасеть" в настройках IE. Выводит диалоговое окно с содержанием "Введённый узел уже имеется в другой зоне. Удалите узел из другой зоны перед добавлением в текущую". Но я не добавлял. Проверил другие зоны, но там данный WEB-узел не указан. :(

    Так же установил для зоны "Местная интрасеть" параметр "Проверка подлиности пользователя" в "Автоматический вход в сеть с текущим именем пользователя".

    Для справки. Я не сотрудник компании и соединяюсь по VPN-туннелю. Хотя я думаю, это не влияет на правильность работы модуля mod_ntlm.

    Подскажите, что здесь не так?

    Заранее спасибо за помощь.
     
  9. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    Раз уж решили возродить темку... то может кто в курсе причины по которой скрипт не дружит с новой Вистой?
     
  10. denisKa

    denisKa Активный пользователь

    С нами с:
    4 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Решилась проблемка. Оказывается проблема была в VPN. Для меня не полностью был настроен доступ по VPN. Сотрудники компании без проблем заходили на тестовую страничку и получали ответ:

    Domain is : DOMAIN
    Login is : LOGIN
    host is : HOST

    По поводу
    теперь уже не важно, т.к. всё работает.

    Всё настройки в httpd.conf оказывается были верными. Ошибка в error.log для Apache как раз связаны с доступом по VPN. При тестировании сотрудников подобных записей в error.log нет.

    Вот настроят для меня должным образом доступ по VPN, продолжу дальнейшее тестирование (проблема с POST, кроссбраузерность и т.д.). Возможно последуют новые вопросы, но это уже будет другая тема обсуждения.

    Grisly с Вистой не знаком и как решить проблему не могу Вам подсказать :( . А что пишет и выдаёт :?:
     
  11. denisKa

    denisKa Активный пользователь

    С нами с:
    4 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Здравствуйте! Не решили проблемку с Вистой? Тоже столкнулся с данной проблемой :(
     
  12. Fomitch

    Fomitch Активный пользователь

    С нами с:
    4 апр 2008
    Сообщения:
    1
    Симпатии:
    0
    Народ! Перерыл все вроде....указанный тут скрипт работает только когда в адресной строке localhost
    стоит написать www (таже машина) то получаю Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci
    упарился уже... и в тастед добавлял www и в местную сеть......
    куда дальше копать? :(
     
  13. Daemon.XP

    Daemon.XP Активный пользователь

    С нами с:
    19 ноя 2006
    Сообщения:
    5
    Симпатии:
    0
    Адрес:
    Екатеринбург
    я бы сказал, что это проблема не с вистой, а с самим IE 7 :(
    он не посылает Authorization в headers
     
  14. Daemon.XP

    Daemon.XP Активный пользователь

    С нами с:
    19 ноя 2006
    Сообщения:
    5
    Симпатии:
    0
    Адрес:
    Екатеринбург
    а если сменить на
    PHP:
    1. if (ord($chained64[13]) != 130)
    то Firefox пройдет проверку и вернет нужные значения, IE 7 пока не побежден :(
     
  15. antbofh

    antbofh Активный пользователь

    С нами с:
    15 апр 2008
    Сообщения:
    1
    Симпатии:
    0
    ребят, я с этой проблемкой возился какое-то время... поэтому чтобы вы тоже не тратили время, напишу вам
    проблема с вистой заключается в том, что она посылает тикеты только NTLMv2, и ни один из линуксовых апачевских модулей это дело не поддерживает! вот такая засада...
    собственно единственное решение которое я нашел - использование тикетов Kerberos и Kerberos'ной авторизации
    сейчас какраз разруливаю процесс с корпоративным доменом, т.к. не шибко силен в AD, а админу объяснить цели и задачи очень сложно... но вобщем идея такая что использовать Kerberos... это во меногом проще! как для виндусовых пользователей, так и для линуксовых, которые не авторизуются в домене (тобишь сам апачевский сервер)
    т.ч. юзайте mod_auth_kerb тем более что на данный момент это единственный свежий модуль, все остольной в большинстве своем заброшено в 2001-2003 годах, когда висты еще в принципе небыло, правда протокол тикетов NTLMv2 был, но все-таки никто не удосужился заимплементить)
     
  16. Daemon.XP

    Daemon.XP Активный пользователь

    С нами с:
    19 ноя 2006
    Сообщения:
    5
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Виста может посылать не только NTLMv2, но и NTLM и LM
     
  17. PSB

    PSB Активный пользователь

    С нами с:
    5 май 2008
    Сообщения:
    2
    Симпатии:
    0
    Все доброе время суток!

    Тоже сейчас работаю над реализацией авторегистрацией на внутресетевом сайте. Запустил страницу с скриптом, исправив вышеописанное место с if и пришел ответ в таком виде:
    Domain is :
    Login is : s�.�p�a�l�c�h�u�n�
    host is : s�t�e�e�l�0�0�0�0�5�

    Ответ верный, но что за символы между буквами? В заголовке скрипта у меня стоит юникод-8. Менял кодировку на странице - результата нет? Как это лечить?...
     
  18. PSB

    PSB Активный пользователь

    С нами с:
    5 май 2008
    Сообщения:
    2
    Симпатии:
    0
    Еще один косяк: Первый раз все нормально прошло, а потом начинает спрашивать логин и пароль на сервер....жуть какая-то. Кто-нить объясните как по-человечески внедрить сеё создание в проект
     
  19. denisKa

    denisKa Активный пользователь

    С нами с:
    4 сен 2007
    Сообщения:
    46
    Симпатии:
    0
    Доброго времени суток!

    На текущий момент есть решения по поводу NTLM-авторизации для Vista ? Кстати, писалось, что проблема в IE7. При установке IE7 на WinXP NTLM-авторизация работает успешно.
     
  20. denisKa

    denisKa Активный пользователь

    С нами с:
    4 сен 2007
    Сообщения:
    46
    Симпатии:
    0
  21. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    Если так поменять, то в запросе имени/пароля можно ввести имя существующего юзера, любой пароль и зайти от имени любого юзера...
    Сейчас проблемы на IE8 и есть несколько человек у которых IE6 успешно работал, а потом вдруг слетел... может обновления win повлияли
     
  22. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    Мне не помогло
     
  23. Grisly

    Grisly Активный пользователь

    С нами с:
    8 сен 2006
    Сообщения:
    28
    Симпатии:
    0
    После обновления KB963027 от Microsoft :http://support.microsoft.com/kb/963027 слетает авторизация NTLM.
    решается добавлением в реестр на машине клиента HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 key:BackConnectionHostNames
    value: ИМЯ_СЕРВЕРА
    добавляем строчку "IP_СЕРВЕРА ИМЯ_СЕРВЕРА" в файл %windir%\system32\drivers\etc\hosts
     
  24. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Всем привет! С вашего позволения присоединяюсь к дискуссии. Со вчерашнего дня тоже озадачился этой темой.

    Насколько я смог понять прочитав всю тему с начала, НТМЛый мод очень нестабильный. Просто удивляюсь героизму человека, который рискнет на него поставить в работающем сайте. У меня как-то был аварийный сбой с утра и до обеда. Так и то истерики начались. На эту штуку я точно не буду ставить. Тем более что она перестала обновляться.

    antbofh
    А что за керберос_мод, про который однажды тут обмолвился. Мне больше подходит, потому что, как я понял, работает для Юнихов и Линухов и в любых браузерах. Чем все закончилось с ним?
     
  25. А смысл тогда за апач цеплятся? ставь ИИС, в нем поддержка SSO нативно, от мелкомягких.