如何针对Dynamics 365数据导出服务API进行身份验证?

时间:2018-01-12 11:33:49

标签: oauth-2.0 dynamics-crm postman dynamics-crm-online data-export

我为Dynamics 365设置了一个名为Data Export Service的内容,以便将其复制到Azure SQL数据库中。这是按预期工作的。

如果此服务遇到任何错误,我正在尝试主动通知。通过CRM本身的设置but they do provide an API似乎没有本地方法来实现这一点。 Swagger页面概述了所有方法can be found here

我正在尝试使用Postman调用GetProfilesByOrganizationId方法:

https://discovery.crmreplication.azure.net/crm/exporter/profiles?organizationId=4ef7XXXX-XXXX-XXXX-XXXX-XXXXXX8a98f&status=true

我遇到身份验证问题,并且始终收到以下错误:

  

“消息”:“收到未经身份验证的requestRequest Url https://discovery.crmreplication.azure.net/crm/exporter/profiles?organizationId=4ef7XXXX-XXXX-XXXX-XXXX-XXXXXX8a98f&status=true

我在Azure中注册了一个应用程序,该应用程序有权代表经过身份验证的用户访问Dynamics 365,在这种情况下,我是管理员。

我已在Postman的“授权”选项卡上将“类型”设置为OAuth 2.0。我已成功使用授权类型授权代码对上述应用程序请求访问令牌。这为请求添加了标题:

  

密钥:授权
  价值:持票人BIGLONGACCESSTOKEN

尽管存在此标题,我仍然会收到上述错误。

API文档意味着身份验证是OAuth2 Implicit Grant Flow(单击文档中的任何红色感叹号)但我无法在Postman中使用它。当我尝试使用此方法请求令牌时,我收到错误:

  

unsupported_response_type

...在Postman控制台中。

如何在Postman中对此API进行身份验证(使用Implicit Grant?)?

(如果他们更合适,我会接受C#示例,但如果Postman无法告诉我我需要什么,我会感到惊讶)

1 个答案:

答案 0 :(得分:1)

如果使用更新的方法更新了Microsoft 所显示的代码示例,并且Azure中没有记录的一些额外配置。

Azure配置

通过安装Data Export服务(假设它一切正常),您将在Azure AD中列出一个新的企业应用程序 Crm Exporter

要利用此应用程序并使用Data Export API进行身份验证,您必须配置自己的应用程序。

转到Azure AD中的“应用程序注册”选项卡,然后添加新的应用程序注册 为其命名并将Application类型设置为Native。重定向URI通常不重要,只要它有效。

点击清单按钮修改清单,将属性oauth2AllowImplicitFlow更改为true并保存更改。

唯一的其他重要配置是必需权限,应设置如下:

  • Windows Azure Active Directory
    • 委派权限
      • 登录并阅读用户个人资料
  • Microsoft Dynamics 365数据导出服务(Crm导出程序)
    • 委派权限
      • 可以访问Microsoft Dynamics 365 API的数据导出服务

然后,您需要点击授予权限

C#更改

更新的方法如下所示:

using Microsoft.IdentityModel.Clients.ActiveDirectory;

string clientId = "11cfXXXX-XXXX-XXXX-XXXX-XXXXXXXXd020";
string user = "my.username@domain.com";
string password = "PASSWORD";

var authParam= await AuthenticationParameters.CreateFromResourceUrlAsync(
    new Uri("https://discovery.crmreplication.azure.net/crm/exporter/aad/challenge")
);

var context = new AuthenticationContext(authParam.Authority, false);

var credentials = new UserPasswordCredential(user, password);

var token = await context.AcquireTokenAsync(authParam.Resource, clientId, credentials).AccessToken;

现在,您可以通过提供标记作为标题来查询数据导出API:

  

授权:持票人eJ0y ........ Hgzk

curl -X GET --header 'Accept: application/json' 'https://discovery.crmreplication.azure.net/crm/exporter/profiles?organizationId=MyOrgId&status=true'