PHP SOAPClient 使用 Windows 身份验证背后的 MS Dynamics WSDL 方法

PHP SOAPClient consuming MS Dynamics WSDL Methods behind Windows Authentication

我正在尝试连接到需要 windows 身份验证的 Web 服务。 我正在 PHP 中编写代码并尝试调用 MS dynamics 365 wsdl 的方法 但我得到的只是 Forbidden608 error code: There is insufficient account information to log you on.

我已经尝试了 NTLMSoapClientNuSoap 类,但是当它没有抛出 Forbidden 消息时,它会给我空对象的 NULL 值,最后仍然没有得到方法的响应。

我的代码与此类似

<?php 
$login = "user@dynamicsaccount.com";
$password = "password";
$url = "https://domainname.sandbox.ax.dynamics.com/pathto/soap/service/someservice?wsdl";
$arrayOpt = array(
"soap_version" => SOAP_1_1,
"cache_wsdl"   =>WSDL_CACHE_NONE,
"exceptions"   =>false,
"trace"        =>true,
'authentication'=> SOAP_AUTHENTICATION_BASIC,
'login'        =>$login,
'password'     =>$password
);

$client = new SoapClient($url, $arrayOpt);
$param = array('someParam' => "value");

print_r($client->__getFunctions()); // i get the full functions from the wsdl
$result = $client->getInfo($param); 

var_dump($result); // i get a:Forbidden [Message]=>string(55) "There is insufficient account information to log you on"


?>

即使我使用 SOAPUI 我得到相同的结果

  <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/2009/WebFault">a:Forbidden</faultcode>
         <faultstring xml:lang="en-US">Forbidden</faultstring>
         <detail>
            <Win32Exception xmlns="http://schemas.datacontract.org/2004/07/System.ComponentModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema">
               <NativeErrorCode i:type="x:int" xmlns="">608</NativeErrorCode>
               <ClassName i:type="x:string" xmlns="">System.ComponentModel.Win32Exception</ClassName>
               <Message i:type="x:string" xmlns="">There is insufficient account information to log you on</Message>
               <Data i:nil="true" xmlns=""/>
               <InnerException i:nil="true" xmlns=""/>
               <HelpURL i:nil="true" xmlns=""/>
               <StackTraceString i:nil="true" xmlns=""/>
               <RemoteStackTraceString i:nil="true" xmlns=""/>
               <RemoteStackIndex i:type="x:int" xmlns="">0</RemoteStackIndex>
               <ExceptionMethod i:nil="true" xmlns=""/>
               <HResult i:type="x:int" xmlns="">-2147467259</HResult>
               <Source i:nil="true" xmlns=""/>
               <WatsonBuckets i:nil="true" xmlns=""/>
            </Win32Exception>
         </detail>
    </s:Fault>

我期待一个字符串数组作为响应,但我一直收到 Forbidden 请求,需要更多信息。我不知道我需要传递什么信息来访问这些方法。 Windows 身份验证需要什么?我如何使用 PHP 实现它?

因此,通过使用此 github 帐户 https://github.com/microsoft/Dynamics-AX-Integration

中的 phpApplication 动态集成示例解决了这个问题

阅读 here 中的 Microsoft 文档后,我了解到它需要从 azure AD 获取授权令牌,并且需要在我的 curl header 中添加该令牌作为 Authorization: Bearer tokenString

我没有使用 SOAPClient,而是使用 Curl 进入 Dynamics AX 在这样做的过程中,我获得了授权并进入。之后我遇到了另一个问题 you can find it here 。现在我面临一个不同的问题;看来我能够使用我的授权令牌承载 Header,但我得到:

Forbidden 1317 System.ComponentModel.Win32Exception The specified account does not exist

我创建了一个不同的 post,以防万一我解决了它,我会 post 我的答案,或者如果有人已经解决了它.. 请告诉我。

Here is the link to the my new Error