4

我是 D365 Finance & Operations 的新手,在 GitHub 上看到了 Microsoft 的服务示例。认为尝试将简单的 .NET C# 控制台应用程序连接到 D365 是一个好的开始。我知道这是一个 Dynamics AX 集成,所以如果有任何特定于 D365 Finance & Operation 的内容,请指导我。

我在 Azure AD 上注册了我的 D365 实例(不是试用版),创建了一个密钥,并为其授予了 Microsoft Dynamics ERP 的权限。我还在 D365 上注册了 Azure AD 应用程序(系统管理 > 设置)。

在我的 .NET 解决方案中,我更新了配置以匹配我在 Azure AD 租户、客户端/应用程序 ID 和 D365 URI 上的配置。

当我运行控制台应用程序时,我成功地创建了承载类型的身份验证令牌。第二次我尝试访问数据时出现 401 错误。这是我使用 Fiddler 记录的请求和响应示例。

GET https://xxxxx.sandbox.ax.dynamics.com/data/LegalEntities 
HTTP/1.1
OData-Version: 4.0
OData-MaxVersion: 4.0
Accept: application/json;odata.metadata=minimal
Accept-Charset: UTF-8
User-Agent: Microsoft ADO.NET Data Services
Authorization: Bearer xxxxxxxxxx
Host: xxxxx.sandbox.ax.dynamics.com

HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/10.0
WWW-Authenticate: authorization_uri="https://login.windows.net/xxxxx/oauth2/authorize"
ms-dyn-fqhn: sms-dev-1-99efa75e-d745-4a64-9d27-a06f7b230253
ms-dyn-namespace: AxProdDevTest
ms-dyn-tenant: devtest-lcs-99efa75e-d745-4a64-9d27-a06f7b230253
ms-dyn-role: dev
ms-dyn-aid: 371cd53f-ee91-0004-d4f8-1e3791eed301
X-Powered-By: ASP.NET
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
p3p: CP="No P3P policy defined.  Read the Microsoft privacy statement at     https://go.microsoft.com/fwlink/?LinkId=271135"
Date: Mon, 11 Jun 2018 13:59:06 GMT
Content-Length: 0

我注意到在回复中明确表示没有定义 P3P 策略。有人可以解释一下吗?

此外,我是否缺少一些配置?我正在设法获得令牌,所以连接就在那里。看来我只是无权访问数据。

谢谢

更新 - 添加了我当前正在执行的源代码

string authHeader = string.Empty;
UriBuilder uri = new UriBuilder(ConfigurationManager.AppSettings["AzureUri"]);
AuthenticationContext authenticationContext = new AuthenticationContext(uri.ToString(), false);

string clientId = ConfigurationManager.AppSettings["ClientId"];
string clientSecret = ConfigurationManager.AppSettings["ClientSecret"];
ClientCredential clientCred = new ClientCredential(clientId, clientSecret);

Task <AuthenticationResult> authenticationResult = authenticationContext.AcquireTokenAsync(ConfigurationManager.AppSettings["DynamicsUri"], clientCred);
authHeader = authenticationResult.Result.CreateAuthorizationHeader();

Uri dataUri = new Uri(ConfigurationManager.AppSettings["DynamicsUri"] + "/data", UriKind.Absolute);
var context = new Resources(dataUri);

context.SendingRequest2 += new EventHandler<SendingRequest2EventArgs>(delegate (object sender, SendingRequest2EventArgs e) {
    e.RequestMessage.SetHeader("Accept", "application/json");
    e.RequestMessage.SetHeader("Authorization", authHeader);
});

foreach (var empEntity in context.Employees.Execute()){
    Console.WriteLine("Name: {0}", empEntity.Name);
}
4

0 回答 0