Проблема NTLM при подключении к веб-службам NAV из PHP

У меня возникли проблемы с использованием службы SOAP Microsoft Dynamics NAV 2009 из PHP.

PHP работает с сервера Linux, и я использую SoapClient . Вместо URL-адреса я использую XML-файл WSDL, загруженный из браузера.

У меня есть учетные данные пользователя для аутентификации с использованием аутентификации BASIC (те же, которые меня запрашивают при доступе к WSDL из браузера). Администраторы сервиса сообщили мне, что они отключили NTLM следующим образом:

<add key="webServicesUseNTLMAuthentication" value="false"></add>

Но я продолжаю получать следующий ответ от сервера:

      HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: NTLM
Date: Tue, 23 May 2023 10:28:59 GMT

Error: SoapFault exception: [HTTP] Unauthorized in myscript.php:40
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://X.X.X...', 'urn:microsoft-d...', 1, 0)
#1 myscript.php(40): SoapClient->__soapCall('myFunction', Array)

Это упрощенный код, который я использую:

      <?php


$wsdlPath = 'downloaded.xml';

$context = stream_context_create([
    'ssl' => [
    // set some SSL/TLS specific options
    'verify_peer' => false,
    'verify_peer_name' => false,
    'allow_self_signed' => true
    ]
   ]);

$soapOptions = array(
    'authentication' => SOAP_AUTHENTICATION_BASIC,
    'login' => 'XXXXX',
    'password' => 'XXXXX',
    'trace' => 1,
    "stream_context" => $context,
    'soap_version' => SOAP_1_1, 
    'connection_timeout' => 120, 
    'cache_wsdl' => WSDL_CACHE_NONE

);


// create a new SoapClient object and set the endpoint URL and options
$soapClient = new SoapClient($wsdlPath, $soapOptions);

// set the SOAP request parameters as an associative array
$requestParams = array(
    'generic_param_0' => 'X',
    'generic_param_1' => 'Y',
    'generic_param_2' => "Z"
);

try {
    
    $response = $soapClient->__soapCall("myFunction", array($requestParams));
    echo $response;

} catch (SoapFault $e) {
    
    $response1 = $soapClient->__getLastResponseHeaders();
    echo $response1 . "\n";;    
    echo 'Error: ' . $e;
}


?>

Я не знаю, что происходит. Кажется, есть еще один уровень аутентификации. Кто-нибудь смог подключиться к Nav Web с PHP? Заранее спасибо.

1 ответ

Невозможно войти в Nav 2009 с использованием базовой аутентификации. Это либо NTLM, либо Kerberos, либо что-то еще. Если они отключили ntlm, это не значит, что вы можете использовать базовую аутентификацию. Вы не можете. Ни за что. Для Nav доступны только механизмы аутентификации Windows.

Другие вопросы по тегам