PHP NTLM身份验证到Active Directory +保持会话

时间:2013-02-27 09:05:49

标签: php curl active-directory ntlm

我有基于NTLM(Active Directory)的服务,我需要编写一个PHP应用程序。通常,用户使用Activre Directory凭据登录到网站,这没关系。 但我想做的是让他们输入他们的凭据到PHP编写的网站,下一步将使用cURL来验证用户通常登录的基于Active Directory的网站。

这部分很难。然后,我需要保持通过PHP cURL脚本对基于Active Directory的站点进行身份验证的用户会话,以便稍后再次使用它们 (CRON查询站点以确定它已发生变化并在发生这种情况时自动执行某些操作,这通常是用户手动完成的)。 为了在发生此更改时不再存储其凭据以进行身份​​验证,我不知何故需要将PHP cURL站点中的NTLM会话存储到每个经过身份验证的用户 该网站通过这个PHP cURL网站。 我的问题是:这有可能吗?

提前致谢。

@Willem Mulder

您发布的代码实际上存储了cookie,但这不是我的观点因为我已经这样做了(抱歉以前没有写过)。到目前为止我得到的是:

        $cookie_file_path = dirname(__FILE__) . '/cookies.txt';
        $ch = curl_init();

        //==========================================================================
         curl_setopt($ch, CURLOPT_USERPWD, $username. ':' . $password);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
         curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
         curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
         curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
         curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
         curl_setopt($ch, CURLINFO_HEADER_OUT, true);
         curl_setopt($ch, CURLOPT_FAILONERROR, 0);
         curl_setopt($ch, CURLOPT_MAXREDIRS, 100);
        //==========================================================================
        $ret = curl_exec($ch);

通过使用选项CURLOPT_COOKIEFILECURLOPT_COOKIEJAR,cURL将cookie存储在本地文件“cookies.txt”中。问题是,当我评论CURLOPT_USERPWD选项时(在验证和存储cookie之后,理论上我有会话),我无法授权网站。也许它重新初始化NTLM握手授权,并期望用户名和密码,我不想存储。

我只想存储会话信息,为此会话信息提供服务并省略第二次身份验证,但cURL似乎不从cookie文件中获取此数据,并且 REWRITES 将不相关的数据发送到我从服务中回复 NOT AUTHRORISED 访问请求。

1 个答案:

答案 0 :(得分:1)

嗯,是的,你可以

$ch = curl_init('http://www.google.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Get headers too with this line
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch);
// Get cookie
preg_match('/^Set-Cookie:\s*([^;]*)/mi', $result, $m);

var_dump(parse_url($m[1]));

// And then of course store it somewhere :-)

如此处所见how to get the cookies from a php curl into a variable