【发布时间】:2012-03-23 12:47:07
【问题描述】:
我有一个 PHP 脚本,它一直在使用带有 curl 的 NuSOAP 来使用 Exchange Web 服务。我让它工作得很好,与稍旧版本的 Exchange 以及 Exchange 2010 对话。
最近我们在服务器上进行了操作系统升级,升级了很多软件包。从那时起,Exchange 代码就不起作用了。它仍然适用于旧服务器,但根本无法与 Exchange 2010 服务器通信。
返回的错误是“HTTP 身份验证失败”。
我当然已经三重检查以确保用户名和密码正确,并且代码没有改变,服务器也没有改变,所以这似乎与服务器软件升级有关。
虽然它仍然适用于较旧的交换服务器,但似乎很奇怪。
被告知不要验证 ssl 证书,因为它们是自签名的,因为它们目前是测试机器,所以我认为这不是证书验证错误。我可以通过浏览器对 Exchange 服务器上的 Web 服务进行身份验证和查看,因此我知道它仍然处于活动状态。
服务器是刚刚升级到10.04.4的Ubuntu Server。
这是一些在旧版 Exchange 服务器上仍然有效的代码。
$client = new nusoap_client($webservice_wsdl, true);
$client->setCredentials($exch_user, $exch_pass, 'ntlm');
$client->setUseCURL(true);
$client->useHTTPPersistentConnection();
$client->setCurlOption(CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
$client->setCurlOption(CURLOPT_USERPWD, $exch_user.':'.$exch_pass);
$client->setCurlOption(CURLOPT_SSL_VERIFYPEER, false);
$client->setCurlOption(CURLOPT_SSL_VERIFYHOST, false);
$client->soap_defencoding = 'UTF-8';
$xml = '<FindItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"';
$xml .= ' xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" Traversal="Shallow">';
$xml .= ' <ItemShape>';
$xml .= ' <t:BaseShape>IdOnly</t:BaseShape>';
$xml .= ' <t:AdditionalProperties>';
$xml .= ' <t:FieldURI FieldURI="message:From"/>';
$xml .= ' <t:FieldURI FieldURI="item:Subject"/>';
$xml .= ' <t:FieldURI FieldURI="message:IsRead"/>';
$xml .= ' <t:FieldURI FieldURI="item:DateTimeReceived"/>';
$xml .= ' <t:FieldURI FieldURI="calendar:Start"/>';
$xml .= ' <t:FieldURI FieldURI="calendar:End"/>';
$xml .= ' <t:FieldURI FieldURI="calendar:Location"/>';
$xml .= ' <t:FieldURI FieldURI="task:Status"/>';
$xml .= ' <t:FieldURI FieldURI="task:DueDate"/>';
$xml .= ' </t:AdditionalProperties>';
$xml .= ' </ItemShape>';
$xml .= ' <IndexedPageItemView Offset="'.$position.'" MaxEntriesReturned="5" BasePoint="Beginning"/>';
$xml .= ' <ParentFolderIds>';
$xml .= ' '.$fxml;
$xml .= ' </ParentFolderIds>';
$xml .= '</FindItem>';
$result = $client->call('FindItem', utf8_encode($xml));
【问题讨论】:
-
您确定您的 Exchange 已配置为使用 NTLM 身份验证吗?
-
是的,一直到现在都没有改变。我已经检查过了。交换服务器上没有任何变化。
-
我也遇到了同样的问题,蒂姆。你有办法弄清楚你的吗?值得庆幸的是,我们使用的身份验证还在本地存储了用户名和密码的单向哈希和加盐版本,因此人们仍然可以进行身份验证,但是当人们更改他们的 ActiveDirectory 密码时,现在出现了断开连接......我发现当我使用遵循代码,事情似乎有效......但具有讽刺意味的是,当我使用从程序代码创建的 OOP 类时,它没有。 stackoverflow.com/a/3998859/155421如果我找到解决方案,我一定会回来发布我的发现。
-
是的...终于在我的开发盒上使用 OOP 类完成了所有工作 - 我认为我的编辑器将制表符插入到 XML 中,而不是 EWS 不喜欢的软空间。将其转移到生产中,它仍然无法正常工作。尝试在 dev 上使用您的 CURL 版本 - 效果很好。移至生产 - 结果相同。我相信我们的盒子是一个 Debian 6.0 发行版……但 NuSOAP 调试并不能说明什么。
标签: php soap curl exchange-server ubuntu-10.04