Как выполнить проверку подлинности с помощью Azure Active Directory в приложении Connect for Business Central? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь написать приложение для подключения, которое будет получать набор данных из внешнего источника и помещать их в экземпляр бизнес-центра Microsoft Dynamics 365 через свои API-интерфейсы.В документации говорится, что для этого есть два способа: обычная проверка подлинности и вход в систему через Azure Active Directory.Первое легко и просто сделать программно, но документация ясно показывает, что оно не предназначено для производственных сред.Я могу сделать последнее с помощью Postman, но часть процесса заключается в том, что я ввожу учетные данные во всплывающем окне.Поскольку сценарий использования конечного продукта будет выполняться без взаимодействия с пользователем, этого не произойдет.Я хочу, чтобы приложение само обрабатывало учетные данные того, что будет учетной записью службы.

Я могу изменять записи, используя обычную аутентификацию и активный каталог, если я заполняю форму входа в систему по запросу.Я пытался использовать библиотеку ADAL, но передача учетных данных моей учетной записи таким образом привела к следующему ответу: {"error": "invalid_request", "error_description": "AADSTS90014: Тело запроса должно содержать следующий параметр: 'client_secretили client_assertion.} У меня есть доступ к секрету клиента, но, похоже, я не нашел средств для его передачи через ADAL.

Я также попытался, по рекомендации коллеги, войти в систему.при использовании идентификатора клиента и секрета клиента в качестве имени пользователя и пароля. В результате мы получили следующий код:

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>

1 Ответ

0 голосов
/ 10 июня 2019

Я никогда не использовал 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;
    }
}

Я надеюсь, что это работает для вас.

...