Может у кого есть, а то я не могу зарегистрироваться. Или кто сам писал похожее, тоже можно опубликовать. http://phpclasses.segmenta.ru/browse/file/7495.html
Код (Text): <?php /*********************************************************************** * PHP NTLM GET LOGIN * Version 0.2 * ==================================================== * * Copyright (c) 2004 Nicolas GOLLET (Nicolas.gollet@secusquad.com) * Copyright (c) 2004 Flextronics Saint-Etienne * * This program is free software. You can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * ***********************************************************************/ /* L'identification par NTLM se fait en 6 etape : etape: | type: | Info echange -------|----------------|-------------------------------------------------- 1 | C --> S | GET ... legende : C = Client -------|----------------|-------------------------------------------------- S = Serveur 2 | C <-- S | 401 Unauthorized | | WWW-Authenticate: NTLM -------|----------------|-------------------------------------------------- 3 | C --> S | GET ... | | Authorization: NTLM <base64-encoded type-1-message> -------|----------------|-------------------------------------------------- 4 | C <-- S | 401 Unauthorized | | WWW-Authenticate: NTLM <base64-encoded type-2-message> -------|----------------|-------------------------------------------------- 5 | C --> S | GET ... | | Authorization: NTLM <base64-encoded type-3-message> -------|----------------|-------------------------------------------------- 6 | C <-- S | 200 Ok -------|----------------|-------------------------------------------------- */ $headers = apache_request_headers(); // Recuperation des l'entetes client if($headers['Authorization'] == NULL){ //si l'entete autorisation est inexistante header( "HTTP/1.0 401 Unauthorized" ); //envoi au client le mode d'identification header( "WWW-Authenticate: NTLM" ); //dans notre cas le NTLM exit; //on quitte }; if(isset($headers['Authorization'])) //dans le cas d'une authorisation (identification) { if(substr($headers['Authorization'],0,5) == 'NTLM '){ // on verifit que le client soit en NTLM $chaine=$headers['Authorization']; $chaine=substr($chaine, 5); // recuperation du base64-encoded type1 message $chained64=base64_decode($chaine); // decodage base64 dans $chained64 if(ord($chained64{8}) == 1){ // |_ byte signifiant l'etape du processus d'identification (etape 3) // verification du drapeau NTLM "0xb2" a l'offset 13 dans le message type-1-message : if (ord($chained64[13]) != 178){ echo "Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci"; exit; } $retAuth = "NTLMSSP"; $retAuth .= chr(0); $retAuth .= chr(2); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(40); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(1); $retAuth .= chr(130); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(2); $retAuth .= chr(2); $retAuth .= chr(2); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth .= chr(0); $retAuth64 =base64_encode($retAuth); // encode en base64 $retAuth64 = trim($retAuth64); // enleve les espaces de debut et de fin header( "HTTP/1.0 401 Unauthorized" ); // envoi le nouveau header header( "WWW-Authenticate: NTLM $retAuth64" ); // avec l'identification supplementaire exit; } else if(ord($chained64{8}) == 3){ // |_ byte signifiant l'etape du processus d'identification (etape 5) // on recupere le domaine $lenght_domain = (ord($chained64[31])*256 + ord($chained64[30])); // longueur du domain $offset_domain = (ord($chained64[33])*256 + ord($chained64[32])); // position du domain. $domain = substr($chained64, $offset_domain, $lenght_domain); // decoupage du du domain //le login $lenght_login = (ord($chained64[39])*256 + ord($chained64[38])); // longueur du login. $offset_login = (ord($chained64[41])*256 + ord($chained64[40])); // position du login. $login = substr($chained64, $offset_login, $lenght_login); // decoupage du login // l'host $lenght_host = (ord($chained64[47])*256 + ord($chained64[46])); // longueur de l'host. $offset_host = (ord($chained64[49])*256 + ord($chained64[48])); // position de l'host. $host = substr($chained64, $offset_host, $lenght_host); // decoupage du l'host echo "Domain is : $domain"; echo "<br>Login is : $login"; echo "<br>host is : $host"; } } } ?> Взято с phpclub.ru
У меня Type 1 message приходит с флагами 0x078208a2 и по этой причине не проходит проверка на "0xb2" PHP: 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. На данный момент я не совсем понимаю что необходимо для получения этих флагов. Кто что подскажет :?:
Занимательно то, что если в IE security выставить опцию "Automatic logon with current username and password" то приходят те два недостающих флага, а если происходит запрос пароля/логина, то все слетает. Но ведь каждого пользователя не заставить включать опцию именно в это положение
Похоже, что единственный вариант добавить узел в Trusted sites и убедиться, что там выбрана эта опция. (мне не особо нравится данное решение, но время не позволяет долго копаться в этой проблеме).
Здравствуйте! Снова хочу вернуться к теме 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. Подскажите, что здесь не так? Заранее спасибо за помощь.
Раз уж решили возродить темку... то может кто в курсе причины по которой скрипт не дружит с новой Вистой?
Решилась проблемка. Оказывается проблема была в VPN. Для меня не полностью был настроен доступ по VPN. Сотрудники компании без проблем заходили на тестовую страничку и получали ответ: Domain is : DOMAIN Login is : LOGIN host is : HOST По поводу теперь уже не важно, т.к. всё работает. Всё настройки в httpd.conf оказывается были верными. Ошибка в error.log для Apache как раз связаны с доступом по VPN. При тестировании сотрудников подобных записей в error.log нет. Вот настроят для меня должным образом доступ по VPN, продолжу дальнейшее тестирование (проблема с POST, кроссбраузерность и т.д.). Возможно последуют новые вопросы, но это уже будет другая тема обсуждения. Grisly с Вистой не знаком и как решить проблему не могу Вам подсказать . А что пишет и выдаёт :?:
Народ! Перерыл все вроде....указанный тут скрипт работает только когда в адресной строке localhost стоит написать www (таже машина) то получаю Votre navigateur Internet n'est pas compatible avec le NTLM, utiliser IE...Merci упарился уже... и в тастед добавлял www и в местную сеть...... куда дальше копать?
а если сменить на PHP: if (ord($chained64[13]) != 130) то Firefox пройдет проверку и вернет нужные значения, IE 7 пока не побежден
ребят, я с этой проблемкой возился какое-то время... поэтому чтобы вы тоже не тратили время, напишу вам проблема с вистой заключается в том, что она посылает тикеты только NTLMv2, и ни один из линуксовых апачевских модулей это дело не поддерживает! вот такая засада... собственно единственное решение которое я нашел - использование тикетов Kerberos и Kerberos'ной авторизации сейчас какраз разруливаю процесс с корпоративным доменом, т.к. не шибко силен в AD, а админу объяснить цели и задачи очень сложно... но вобщем идея такая что использовать Kerberos... это во меногом проще! как для виндусовых пользователей, так и для линуксовых, которые не авторизуются в домене (тобишь сам апачевский сервер) т.ч. юзайте mod_auth_kerb тем более что на данный момент это единственный свежий модуль, все остольной в большинстве своем заброшено в 2001-2003 годах, когда висты еще в принципе небыло, правда протокол тикетов NTLMv2 был, но все-таки никто не удосужился заимплементить)
Все доброе время суток! Тоже сейчас работаю над реализацией авторегистрацией на внутресетевом сайте. Запустил страницу с скриптом, исправив вышеописанное место с 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. Менял кодировку на странице - результата нет? Как это лечить?...
Еще один косяк: Первый раз все нормально прошло, а потом начинает спрашивать логин и пароль на сервер....жуть какая-то. Кто-нить объясните как по-человечески внедрить сеё создание в проект
Доброго времени суток! На текущий момент есть решения по поводу NTLM-авторизации для Vista ? Кстати, писалось, что проблема в IE7. При установке IE7 на WinXP NTLM-авторизация работает успешно.
Вопрос решился. Вот решение http://www.mactime.ru/publication?id=7256 . Лично не проверял, но сказали что помогло.
Если так поменять, то в запросе имени/пароля можно ввести имя существующего юзера, любой пароль и зайти от имени любого юзера... Сейчас проблемы на IE8 и есть несколько человек у которых IE6 успешно работал, а потом вдруг слетел... может обновления win повлияли
После обновления 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
Всем привет! С вашего позволения присоединяюсь к дискуссии. Со вчерашнего дня тоже озадачился этой темой. Насколько я смог понять прочитав всю тему с начала, НТМЛый мод очень нестабильный. Просто удивляюсь героизму человека, который рискнет на него поставить в работающем сайте. У меня как-то был аварийный сбой с утра и до обеда. Так и то истерики начались. На эту штуку я точно не буду ставить. Тем более что она перестала обновляться. antbofh А что за керберос_мод, про который однажды тут обмолвился. Мне больше подходит, потому что, как я понял, работает для Юнихов и Линухов и в любых браузерах. Чем все закончилось с ним?