Как выполнить проверку подлинности с помощью Azure Active Directory в приложении Connect for Business Central?
Я пытаюсь написать приложение для подключения, которое будет получать набор данных из внешнего источника и помещать его в экземпляр бизнес-центра 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 ответ
Я никогда не использовал 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;
}
}
Я надеюсь, что это работает для вас.