2015-02-06 41 views
0

我正在嘗試連接到Navision 2009 SP1所公開的Web服務,該服務需要NTLM身份驗證。Perl SOAP :: Lite服務 - 使用NTLM和Navision 2009 SP1進行身份驗證

驗證適用於service()調用 - 意思是我得到存根返回!但是,一旦我嘗試調用一個函數,認證就不復存在。

我試着再次爲$服務設置證書(然後缺少keep_alive),我也嘗試使用PATCH_HTTP_KEEPALIVE常量,但都沒有幫助。

$SOAP::Constants::PATCH_HTTP_KEEPALIVE = 1; # does this even do anything? 

my $ua = LWP::UserAgent->new(keep_alive => 1); 
$ua->credentials($host, '', $domain_user, $password); 

my $client = SOAP::Lite->new(); 
$client->schema->useragent($ua); 

# this works! 
my $service = $client->service($service_url)->proxy($service_url); 

# this is just a test - how can I set keep_alive again? 
$service->{_transport}->{_proxy}->credentials($host, '', $domain_user, $password); 

# this returns 401 unauthorized 
$service->Read('R1446781'); 

這充分反應,我得到:

SOAP::Transport::HTTP::Client::send_receive: HTTP::Request=HASH(0x224adf8) 
SOAP::Transport::HTTP::Client::send_receive: POST http://somedomain.org:7047/DynamicsNAV/WS/Company%20Name/Page/InvHeader HTTP/1.1 
Accept: text/xml 
Accept: multipart/* 
Accept: application/soap 
Content-Length: 485 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "urn:microsoft-dynamics-schemas/page/invheader:Read" 

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:microsoft-dynamics-schemas/page/invheader" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><tns:Read><No xsi:type="xsd:string">R1446781</No></tns:Read></soap:Body></soap:Envelope> 
The keep_alive option must be enabled for NTLM authentication to work. NTLM authentication aborted. 
SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x22511b8) 
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 401 Unauthorized 
Date: Fri, 06 Feb 2015 09:42:22 GMT 
Server: Microsoft-HTTPAPI/2.0 
WWW-Authenticate: NTLM 
Content-Length: 0 
Client-Date: Fri, 06 Feb 2015 09:42:22 GMT 
Client-Peer: somedomain.org:7047 
Client-Response-Num: 1 

401 Unauthorized at script/test_webservice.pl line 36. 

如何使用我已經用於服務相同的認證我驗證$服務功能()調用?

回答

0

想通了:

$服務 - > transport->的Proxy-> conn_cache($ UA-> conn_cache);

它必須使用相同的連接緩存,然後才能正常工作。