带有cURL的PHP NTLM会话

带有cURL的PHP NTLM会话,php,curl,active-directory,ldap,ntlm,Php,Curl,Active Directory,Ldap,Ntlm,所以先来点琐事 在ASP.NET网站中编写了一个应用程序,它使用NTLM协议对想要登录的用户进行身份验证。当他们正常使用它时,他们输入网站URL,提供他们的凭证,在web浏览器中进行身份验证和维护会话,这一切都很正常 我想做的,是创建PHP网站,将作为机器人。这是我公司的内部网站,我被批准这样做。我遇到的问题是管理会话。用户将能够在我的PHP网站中键入他们的凭据,我的PHP网站将使用cURL对目标网站进行身份验证 到目前为止,我得到的代码是: $cookie_file_path = di

所以先来点琐事

在ASP.NET网站中编写了一个应用程序,它使用NTLM协议对想要登录的用户进行身份验证。当他们正常使用它时,他们输入网站URL,提供他们的凭证,在web浏览器中进行身份验证和维护会话,这一切都很正常

我想做的,是创建PHP网站,将作为机器人。这是我公司的内部网站,我被批准这样做。我遇到的问题是管理会话。用户将能够在我的PHP网站中键入他们的凭据,我的PHP网站将使用cURL对目标网站进行身份验证

到目前为止,我得到的代码是:

    $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);
上面的代码通过cURL(似乎是管理NTLM握手)登录到目标网站,并获取网站内容。它还存储发送回cookie文件的会话ID

我接下来要做的是注释
CURLOPT_USERPWD
选项,希望此脚本将使用存储在cookie文件中的会话ID在第二次执行此脚本时对以前登录的用户进行身份验证。它可以删除用户凭据,并且不会以这种方式将其存储在任何地方,因为将其存储在手动创建的会话、数据库或其他任何地方都不安全

我需要这个,因为机器人将使用CRON定期检查网站状态是否已更改,并执行一些用户操作作为对此的反应。但要做到这一点,用户首先必须经过身份验证,他的用户名和密码不能存储在任何地方,所以我必须使用他最初登录时设置的会话信息

CURL似乎不能做到这一点。当我使用注释的
CURLOPT_USERPWD
选项第二次执行脚本时,它不会使用存储的cookie来保持being的身份验证。相反,它重写cookie文件,其中包含从服务发送给我的不相关数据,作为对未授权访问请求的响应

我的问题是: 为什么cURL不使用存储的会话信息来保持being的身份验证? 有没有办法通过基于cURL和NTLM协议的网站来维护此会话


提前谢谢。

几个月前,我遇到了一个与你类似的问题。我试图连接到navision soap api。Navision使用ntlm身份验证。问题是curl不支持ntlm,所以您必须自己做

在这种情况下,一篇对我帮助很大的博文如下:

**编辑

对不起,我误解了你的问题。 你的问题很简单

只需使用此行接收来自请求的标题

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
然后可以从curl_exec函数的结果中获得Set Cookie头

preg_match('/^Set-Cookie:\s*([^;]*)/mi', $ret, $match);
$cookie = parse_url($match[0]);

现在,您可以将它存储在某个地方,并在2ten请求中使用它。

我有同样的问题,我使用
curl\u setopt($ch,CURLOPT\u COOKIEFILE,”)解决了它代码行。字符串应该完全是空的

好吧,这不是我想要的,因为我的问题不是处理身份验证,而是处理和维护会话,所以密码和用户名可以在登录后扔掉。谢谢你的回答,但这一部分,正如我在帖子中所说的,我也完成了。cURL自动将会话信息存储在cookie文件中。我已经启用了CURLOPT_RETURNTRANSFER,因为它列在我的代码列表中。问题是,正如我在帖子中所说,在第二次请求中发送COOKIE信息。我列出的脚本没有这样做,尽管它在cookie文件中存储了会话信息。我不需要通过regex手动存储响应头中的cookie,因为cURL是自动存储的。它只是在第二次请求中没有使用它。嗨@c4pone hace ya mucho tiempo de esto,pero quickás puedas ayudarme。我对米斯莫的问题感到担忧,因为他是一个很好的解决方案。安泰马诺先生,我希望你能重新开始