【问题标题】:Curl, NuSoap, PHP talking to Exchange server authentication errorCurl、NuSoap、PHP 与 Exchange 服务器身份验证错误交谈
【发布时间】: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


【解决方案1】:

我想我已经找到了问题 - 至少在修复它方面。在某个时间点,一定有一个更新(对 Windows 或对 Unix)破坏了通过 NTLM 进行正确通信的能力。

我的服务器使用 curl 7.21 版。我有一个也使用 7.21 的 Linode,但因为我可以使用它,所以我将 curl(使用 SSL)升级到提供 NTLMv2 支持的版本 7.26(7.21 没有)。根据我找到的唯一可以帮助获取此信息的网站,显然 7.25 版也有效:http://blog.ianty.com/ubuntu/exchange-web-services-ews-ntlmv2-and-linux/

我在这里回复是作为答案,但我不能肯定地说这实际上是 答案。至少这是一种可能的答案。

【讨论】:

    【解决方案2】:
    You can get nusoap classes with samples see below url
    
    http://sourceforge.net/projects/nusoap/
    
    Try This
    
    <?php
    /*
     *  $Id: wsdlclient3b.php,v 1.1 2004/06/15 15:38:29 snichol Exp $
     *
     *  WSDL client sample.
     *
     *  Service: WSDL
     *  Payload: rpc/encoded (params as an XML string; cf. wsdlclient3.php)
     *  Transport: http
     *  Authentication: none
     */
    require_once('../lib/nusoap.php');
    $proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
    $proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
    $proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
    $proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
    $client = new soapclient('http://www.scottnichol.com/samples/hellowsdl2.php?wsdl', true, $proxyhost, $proxyport, $proxyusername, $proxypassword);
    $err = $client->getError();
    if ($err) {
        echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    }
    $params = '<person xsi:type="tns:Person"><firstname xsi:type="xsd:string">Willi</firstname><age xsi:type="xsd:int">22</age><gender xsi:type="xsd:string">male</gender></person>';
    $result = $client->call('hello', $params);
    // Check for a fault
    if ($client->fault) {
        echo '<h2>Fault</h2><pre>';
        print_r($result);
        echo '</pre>';
    } else {
        // Check for errors
        $err = $client->getError();
        if ($err) {
            // Display the error
            echo '<h2>Error</h2><pre>' . $err . '</pre>';
        } else {
            // Display the result
            echo '<h2>Result</h2><pre>';
            print_r($result);
            echo '</pre>';
        }
    }
    echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
    echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
    echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多