1

PHP の SOAP 認証に問題があります。私はどこでも答えをチェックしましたが、成功しませんでした。

ここで誰かが私を助けてくれることを願っています!

それで、これが取引です。

私の PHP アプリケーション サーバーは Apache2 を搭載した Debian 6 で、Web サービスは IIS サーバーに基づいています。

どちらのサーバーも社内ネットワーク内にあります。

接続と認証には、Web で検索されたクラスを使用します。

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);
}

注意:「define('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

ここでケルベロスが言及されている理由はわかりません...しかし、手がかりになるかもしれません。

最後になりましたが、
このコードは Windows のローカル マシンで動作します。さらに、Windows環境で再定義する必要がないため、CURLOPT_CERTINFOシームを構成する必要があります。

まぁ、今のところ分かっているのはこれだけです。問題がどこから来たのかわかりません。確かに Debian と IIS 間の認証の問題によるものですが... 詳しくはわかりません。

他に必要な情報があれば遠慮なくどうぞ。ご協力ありがとうございました。

4

2 に答える 2

0

詳細については、問題を解決するための回避策を最終的に見つけました。

この問題は、PHP アプリケーションが Web サービスに接続できるようにするために、IIS サーバーが AD ログイン/パスワードを必要としていたことが原因でした。

私たちが行ったことは、別の URL を使用して Web サービスにアクセスすることでした。この URL には「匿名」アカウントが必要です。これは、アカウントが AD ではなく、アプリケーション自体によって定義されることを意味します。

したがって、問題が発生していた NTLM 認証を使用する必要はありません。

于 2013-09-05T12:03:48.553 に答える
0

とにかく認証する必要がある人にとって、このリンクは私を大いに助けてくれました!

于 2014-11-26T18:12:42.753 に答える