SSO только с NTLM и PHP
Я пытаюсь создать единый вход в домене Windows с использованием NTLM и без серверных модулей с сервером Apache2 на компьютере с Linux, который не находится в домене Windows. Не знаю, возможно ли это вообще. Но сейчас я покажу вам, что я выяснил и что я должен знать дальше.
Хорошо, сначала я включил параметры, которые мой браузер (IE и FF) отправляет Authorization
заголовок с данными NTLM (тип сообщения 1). Это работает, я получаю строку вроде:
NTLMSSP²¢1 (±USERS-PCDOMAIN
Но что дальше? Я должен отправить эту строку на сервер, где моя AD работает правильно? Итак, мой сервер известен как SERVER1.DOMAIN
и имеет IP 192.168.1.14
,
По какому протоколу и каким способом я могу теперь отправить Тип сообщения 1 на мой сервер AD, чтобы получить обратно сообщение с запросом NTLM (тип 2)?
Я думаю, мне придется написать что-то вроде этого:
<?php
$fp = fsockopen("192.168.1.14", 80 /* <--- which port? */, $errno, $errstr, 30);
if (!$fp)
die("$errstr ($errno)");
fwrite($fp, $headers['Authorization'] . "\r\n");
$ntlmChallengeData = '';
while (!feof($fp)) {
$ntlmChallengeData .= fgets($fp, 128);
}
fclose($fp);
var_dump($ntlmChallengeData); // The challenge data
Но на каком порту Windows Server отвечает на мои данные NTLM?
1 ответ
Это невозможно, используя только PHP. Для проверки учетных данных NTLMv2 требуются зашифрованные RPC SecureChannel со службой NETLOGON контроллера домена Active Directory. Сказать, что это трудно сделать, - преуменьшение.
В среде Linux лучше всего было бы заглянуть в пакет "winbind" Samba и выполнить аутентификацию на уровне Apache. Эти модули всегда были немного неуклюжими IMO, но mod_auth_kerb и mod_auth_winbind являются стандартными модулями для этого типа вещей, которые я проверял в последний раз.