仅限NTLM和PHP的SSO

时间:2014-06-15 14:03:33

标签: php ntlm ntlmv2

我尝试使用NTLM在Windows域中创建SSO,并且在不在Windows域中的Linux机器上没有带有Apache2服务器的服务器模块。不知道这是否可能。但我现在告诉你我已经想到了什么以及我接下来要知道的事情。

好的,首先我打开了我的浏览器(IE和FF)使用NTLM数据(消息类型1)发送Authorization标头的选项。这有点像我得到一个字符串:

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服务器在哪个端口上响应我的NTLM数据?

1 个答案:

答案 0 :(得分:1)

仅使用PHP无法实现。验证NTLMv2凭据需要SecureChannel加密的RPC与Active Directory DC的NETLOGON服务。说这是一件很难的事情,这是轻描淡写的。

在Linux环境中,最好的选择是查看Samba&#34; winbind&#34;打包并在Apache级别执行身份验证。这些模块一直是一个有点笨拙的IMO,但mod_auth_kerb和mod_auth_winbind是我检查过的这类事情的标准模块。