1

我对 PHP 中的 SOAP 身份验证有疑问。我到处检查没有成功的答案。

我希望有人能在这里帮助我!

所以这里是交易。

我的 PHP 应用程序服务器是带有 Apache2 的 Debian 6,并且 Web 服务基于 IIS 服务器。

两台服务器都在我们公司的网络内。

对于连接和身份验证,我使用网络上的一个类:

http://tcsoftware.net/blog/2011/08/php-soapclient-authentication/

这是我使用此类的代码:

<?php 
define('CURLOPT_CERTINFO',1);
ini_set("max_execution_time",120);
ini_set('default_socket_timeout', 120);
ini_set("soap.wsdl_cache_enabled", "0");
ini_set('soap.wsdl_cache_ttl',0);

include('./SoapClientAuth.php');

//WSDL
$soapURL = "http://myApplicationAdress/ws/WEB100T/patient_identite_chargerparid.wsdl";
$soapParameters = Array(
                    'login'          => 'anADLogin',
                    'password'       => 'theADPassword',
                    'exceptions'     => 1,
                    'trace'          => 1,
                    'user_agent'     => '',
                    'keep_alive'     => 1
            ) ;
$soapClient = new SoapClientAuth($soapURL, $soapParameters);

try{
    $soapResult = $soapClient->PatientIdentiteChargerParID(array('PatID' =>'152'));
}
catch(SoapFault $fault)
{
    var_dump($fault);
}

注意:“定义('CURLOPT_CERTINFO',1);” 添加这个常量是因为我们的 php 版本中没有定义这个常量。如果我没有定义它,我们有一个错误是:

[03-Sep-2013 15:10:50 UTC] PHP Notice:  Use of undefined constant CURLOPT_CERTINFO - assumed 'CURLOPT_CERTINFO' in /var/www/vm-test/SoapClientAuth.php on line 97
[03-Sep-2013 15:10:50 UTC] PHP Warning:  curl_setopt() expects parameter 2 to be long, string given in /var/www/vm-test/SoapClientAuth.php on line 97

从客户端连接到 debian 服务器的结果是 401 错误,参见以下内容:

* About to connect() to web100t-qualif port 80 (#0)
*   Trying 172.16.101.93... * connected
* Connected to web100t-qualif (172.16.101.93) port 80 (#0)
> POST /mwsiissrv.dll/mws/ws/_mws_soap HTTP/1.1
Host: web100t-qualif
Accept: */*
User-Agent: PHP-SOAP
Content-Type: text/xml; charset=utf-8
SOAPAction: "/patient/identite/chargerparid"
Content-Length: 309
Expect: 100-continue
Connection: Keep-Alive

< HTTP/1.1 401 Unauthorized
< Content-Type: text/html
< Server: Microsoft-IIS/7.5
< WWW-Authenticate: NTLM

第二次,如果我在使用常量 CURLOPT_CERTINFO 的 SoapClientAuth.php 中注释第 97 行:

curl_setopt($ch, CURLOPT_CERTINFO, TRUE); 

然后响应更改如下:

< HTTP/1.1 401 Unauthorized
< Content-Type: text/html
< Server: Microsoft-IIS/7.5
< WWW-Authenticate: NTLM
* gss_init_sec_context() failed: : Credentials cache file '/tmp/krb5cc_33' not found< WWW-Authenticate: Negotiate
< Date: Tue, 03 Sep 2013 12:37:00 GMT
< Content-Length: 1384
<
* Connection #0 to host web100t-qualif left intact
* Closing connection #0
* About to connect() to web100t-qualif port 80 (#0)
*   Trying 172.16.101.93... * connected
* Connected to web100t-qualif (172.16.101.93) port 80 (#0)
> POST /mwsiissrv.dll/mws/ws/_mws_soap HTTP/1.1

我不知道为什么这里提到了 kerberos ......但可能是一个线索。

最后但并非最不重要的一点是,
这段代码可以在我的本地机器上运行,这是一台 Windows 机器。此外,要配置 CURLOPT_CERTINFO 接缝,因为我不需要在我的 Windows 环境中重新定义它。

好吧,这就是我目前所知道的。我想不出问题出在哪里。这肯定是由于 Debian 和 IIS 之间的身份验证问题,但是......我不明白。

如果您需要任何其他信息,请不要犹豫。谢谢您的帮助。

4

2 回答 2

0

对于那些无论如何都需要进行身份验证的人来说,这个链接对我帮助很大!

于 2014-11-26T18:12:42.753 回答
0

有关信息,我们终于找到了解决问题的解决方法。

问题是因为 IIS 服务器需要 AD 登录名/密码才能让我们的 PHP 应用程序连接到 Web 服务。

我们所做的是使用另一个 URL 来访问 Web 服务,该 URL 需要一个“匿名”帐户。这意味着帐户是由应用程序本身而不是 AD 定义的。

因此,我们不需要使用问题所在的 NTLM 身份验证。

于 2013-09-05T12:03:48.553 回答