0

我正在尝试编写一个连接应用程序,该应用程序将从外部源接收一组数据,并通过其 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>
4

1 回答 1

0

我从未使用过 Microsoft Dynamics 365。但我已经使用C#代码验证了使用本地活动目录服务器的用户。

using System.DirectoryServices.AccountManagement;

public class ActiveDirectoryService {
    // The domain url is the url of the active directory server you're trying to validate with.
    public bool ValidateWithActiveDirectoryAsync(string domainUrl, string userName, string password) {
        using (var context = new PrincipalContext(ContextType.Domain, domainUrl)) {
            UserPrincipal UserPrincipal1 = new UserPrincipal(context);
            PrincipalSearcher search = new PrincipalSearcher(UserPrincipal1);
            if (context.ValidateCredentials(userName, password)) {
                return true;
            }
        }
        return false;
    }
}

我希望这个对你有用。

于 2019-06-10T14:29:30.217 回答