我正在尝试编写一个连接应用程序,该应用程序将从外部源接收一组数据,并通过其 API 将其放入 microsoft dynamics 365 业务中心的实例中。文档说有两种方法可以做到这一点,使用基本身份验证和通过 Azure Active Directory 登录。前者以编程方式简单直接地执行,但文档清楚地表明它不适用于生产环境。我可以使用 Postman 完成后者,但部分过程涉及我在弹出窗口中输入凭据。由于最终产品的用例将在没有用户交互的情况下运行,因此这是行不通的。我希望应用程序自己处理将成为服务帐户的凭据。
如果我在提示时填写登录表单,我可以使用基本身份验证和活动目录修改记录。我尝试使用名为 ADAL 的库,但以这种方式传递我的帐户凭据会导致以下响应:{"error":"invalid_request","error_description":"AADSTS90014:请求正文必须包含以下参数:'client_secret或 client_assertion。} 我可以访问客户端密码,但似乎无法通过 ADAL 传递它,我发现了。
在同事的建议下,我还尝试使用客户端 ID 和客户端密码作为用户名和密码登录。以下代码是我们最终得到的:
RestClient client = new RestClient("https://login.windows.net/[my tenant domain]/oauth2/token?resource=https://api.businesscentral.dynamics.com");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("undefined", "grant_type=%20client_credentials&client_id=%20[my client id]&client_secret=[my client secret]&resource=[my resource]", ParameterType.RequestBody);
string bearerToken = "";
try
{
bearerToken = JsonConvert.DeserializeObject<Dictionary<string, string>>(client.Execute(request).Content)["access_token"];
Console.WriteLine(bearerToken);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
上面的代码成功检索了一个令牌,但如果我使用该令牌,我会得到以下响应:
<error xmlns="http://docs.oasis-open.org/odata/ns/metadata"><code>Unauthorized</code><message>The credentials provided are incorrect</message></error>