MS Dynamics CRM 2013和LAMP之间的集成

问题描述 投票:3回答:1

我是一名Web开发人员,致力于客户网站的后端重建。他们希望将现有的CRM系统与新站点集成在一起,以便站点可以对系统执行CRUD查询。但是,我正在努力地成功地对Microsoft系统进行正确的身份验证,并希望获得一些帮助,以规划使该工作正常进行的最佳策略。

系统概述:

服务器:MS Dynamics CRM 2013(面向Internet的部署),使用Active Directory进行身份验证

客户端:LAMP(将运行Drupal 7,但这实际上是我知道的用法!)

首先,我尝试了下面的“发现OAuth端点URL”部分中所述的身份验证方法:

http://msdn.microsoft.com/en-gb/library/dn531009.aspx#bkmk_oauthurl

为此,我在命令行中使用了以下curl:

curl -H "Authorization: Bearer" http://crm.example.com/XRMServices/2011/Organization.svc -v

哪个给出以下输出:

* Hostname was NOT found in DNS cache
*   Trying xx.xx.xx.xx...
* Connected to crm.example.com (xx.xx.xx.xx) port 80 (#0)
> GET /XRMServices/2011/Organization.svc HTTP/1.1
> User-Agent: curl/7.35.0
> Host: crm.example.com
> Accept: */*
> Authorization: Bearer
>
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Length: 3165
< Content-Type: text/html; charset=UTF-8
* Server Microsoft-IIS/8.0 is not blacklisted
< Server: Microsoft-IIS/8.0
< X-AspNet-Version: 4.0.30319
< Set-Cookie: ReqClientId=ee9c75fe-db2e-4775-a71e-c2708c46748b; expires=Tue, 14-Oct-2064 09:16:06 GMT; path=/; HttpOnly
< X-Powered-By: ASP.NET
< Date: Tue, 14 Oct 2014 09:16:06 GMT
<
<HTML>...

但是没有提及authorization-uri :(

我还尝试了相同的命令,其URL结尾为'discovery.svc','organization.svc / web','discovery.svc / web'。后两个确实在响应中包括“ WWW-Authenticate”字段,如下所示:

< WWW-Authenticate: Negotiate
< WWW-Authenticate: NTLM

[这使我相信我尝试了错误的方法,应该研究MS的NTLM身份验证。

我确定PHP-cURL可以使用NTLM,所以我的第二种方法涉及从代码发送SOAP请求。类似于此StackOverflow线程中的代码:

php - access dynamics crm 2011 with web services

这是我的代码:

//sample SOAP envelope from StackOverflow thead
$SOAPEnv = <<<ENV
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services"
           xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <request i:type="b:AssignRequest"
            xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts"
            xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts">
    <a:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
     <a:KeyValuePairOfstringanyType>
      <c:key>Target</c:key>
      <c:value i:type="a:EntityReference">
       <a:Id>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</a:Id>
       <a:LogicalName>account</a:LogicalName>
       <a:Name i:nil="true" />
      </c:value>
     </a:KeyValuePairOfstringanyType>
     <a:KeyValuePairOfstringanyType>
      <c:key>Assignee</c:key>
      <c:value i:type="a:EntityReference">
       <a:Id>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</a:Id>
       <a:LogicalName>systemuser</a:LogicalName>
       <a:Name i:nil="true" />
      </c:value>
     </a:KeyValuePairOfstringanyType>
    </a:Parameters>
    <a:RequestId i:nil="true" />
    <a:RequestName>Assign</a:RequestName>
   </request>
  </Execute>
 </s:Body>
</s:Envelope>
ENV;

$headers = array(
  'Method: POST',
  'Connection: Keep-Alive',
  'User-Agent: PHP-SOAP-CURL',
  'Content-Type: text/xml; charset=utf-8',
  "SOAPAction: http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute",  
);


$url = 'http://crm.example.com/XRMServices/2011/Organization.svc/web';
$username  = 'myusername';
$password  = 'MyP@55w0rd';

$ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $SOAPEnv);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

$output = curl_exec($ch);

这给出了SOAP响应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <s:Fault>
      <faultcode xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">a:FailedAuthentication</faultcode>
      <faultstring xml:lang="en-GB">Access is denied.</faultstring>
    </s:Fault>
  </s:Body>
</s:Envelope>

令人鼓舞的是,这是一个SOAP响应,因此我感到很亲密。它肯定是使用我提供的凭据进行身份验证的,因为如果更改它们,我将不会获得任何SOAP。但是我觉得必须进行另一级别的身份验证才能让SOAP端点知道我是合法客户端。

所以,我觉得有点卡住,因为有关将SOAP与Dynamics结合使用的文档似乎是从Microsoft SDK的角度编写的,对于我只真正了解PHP的经验的人当然毫无帮助。

[如果有人可以对我的方法提供任何反馈,我将不胜感激。如果您能指出正确的方向继续下一步,那会更好。而且我在该项目上的时间已经用完了,所以请专家们解决。请注意,我是一个相对较新的开发人员,因此如果您不得不稍微降低答案的话,请提前道歉:)

非常感谢,Ashwah

我是一名Web开发人员,致力于客户网站的后端重建。他们希望将现有的CRM系统与新站点集成在一起,以便站点可以对系统执行CRUD查询。 ...

authentication curl soap crm microsoft-dynamics
1个回答
1
投票

我在相关方面苦苦挣扎。我可以获取示例Python代码来连接具有租户名称的CRM的云托管版本,但是我试图与具有自己的STS(安全令牌服务器)的本地/ IFD安装集成。使用该域名对我不起作用。我不知道正确的redirect_uri是什么。

© www.soinside.com 2019 - 2024. All rights reserved.