Аутентификация приложения-функции Azure для подключения к Dynamics 365 CRM онлайн - PullRequest
0 голосов
/ 06 июня 2018

Иногда вам нужно знать ответ, чтобы задать правильный вопрос, поэтому я не уверен, является ли заголовок этого запроса идеальным.Как бы там ни было.

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

        IServiceManagement<IOrganizationService> orgServiceManagement;
        orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(System.Environment.GetEnvironmentVariable("OrganizationService")));

        AuthenticationCredentials authCredentials = new AuthenticationCredentials();
        authCredentials.ClientCredentials.UserName.UserName = "[Non-interactive CRM Username here]";
        authCredentials.ClientCredentials.UserName.Password = "[Password here]";
        AuthenticationCredentials tokenCredentials;

        tokenCredentials = orgServiceManagement.Authenticate(authCredentials);

        OrganizationServiceProxy organizationProxy = new OrganizationServiceProxy(orgServiceManagement, tokenCredentials.SecurityTokenResponse);

Мой вопрос ... очевидно, теперь, когда POC работает, я хочу найти способ аутентифицировать функциюПриложите приложение к Azure AD (вместо передачи учетных данных в коде) и получите токен доступа, который я могу использовать для создания моего OrganisationServiceProxy, но как мне поступить?Я не могу найти прямой ответ там.Множество ответов в архитектурном стиле находятся в облаках.Мне нужны ответы в стиле разработчика (сделайте это, затем сделайте это):)

Я уверен, что многие новички в Azure найдут эту информацию полезной.Заранее спасибо.

Примечание для редакторов: этот вопрос отличается от Аутентификация с помощью Dynamics 365 из функции Azure , так как я нахожусь в том же клиенте и подписке, используя временные триггерыа не веб-хуки.Мое функциональное приложение просыпается, подключается к CRM, выполняет некоторые вычисления, обновляет CRM и возвращается в спящий режим.

1 Ответ

0 голосов
/ 26 июня 2018

Мне удалось защитить свои учетные данные с помощью хранилища ключей Azure.Для тех новичков, которые хотят сделать то же самое ... вот шаги.

  1. Войдите на портал Azure и создайте хранилище ключей или, если оно у вас уже есть, перейдите к следующемушаг.
  2. После создания хранилища ключей перейдите в раздел секретов хранилища ключей.Теперь вы создадите секрет для каждого удостоверения, которое вам нужно защитить.В моем случае я создал секрет для имени пользователя и другой для пароля.Каждый раз, когда вы создаете секрет, Azure будет выдавать вам секретный идентификатор.Запомните это, так как вы позже будете использовать это в настройках конфигурации функции Azure.
  3. Затем вам нужно перейти в Azure Active Directory (Azure AD).Вам нужно перейти к регистрации приложений и создать новую регистрацию приложения.На данном этапе не имеет значения, создали ли вы свое функциональное приложение или нет.Этот шаг просто информирует Azure AD о том, что у вас есть приложение, которое вы хотите зарегистрировать, чтобы оно могло выдать вам идентификатор приложения.При создании регистрации приложения вам нужно будет записать выданный идентификатор приложения.Опять же, вы будете использовать это в настройках конфигурации вашего функционального приложения.
  4. Все еще в Azure AD, при регистрации приложения нажмите «Ключи» и создайте новый ключ.Как только вы создадите ключ, Azure предоставит вам значение ключа.( Обратите внимание на это значение, поскольку это единственное время, когда Azure покажет вам это значение. ) Вам также понадобится этот ключ приложения в настройках конфигурации приложения функции Azure.
  5. Вернитесь назадв хранилище ключей Azure и в хранилище ключей, которое вы создали.На этот раз нажмите на Политики доступа.То, что вы делаете здесь, позволяет вашему приложению с зарегистрированной функцией Azure AD подключаться к этому хранилищу ключей.Нажмите «Добавить новый», затем выберите принципала, найдите приложение, зарегистрированное в Azure AD (. Не выбирайте функциональное приложение, которое также будет отображаться здесь, вам нужно выбрать то же имя, которое вы зарегистрировали в Azure AD на шаге 3 выше).) Затем в секретных разрешениях выберите «Получить» и нажмите «Сохранить».
  6. Вот и все, что сделано.Остальные - изменения кода, чтобы все это работало.
  7. Добавьте следующие операторы using в начало вашего кода.

    using Microsoft.Azure.KeyVault;использование Microsoft.IdentityModel.Clients.ActiveDirectory;

  8. Если код вашего функционального приложения находится на портале Azure, добавьте следующее в файл project.json.

    {"frameworks": {"net46": {"dependencies": {"Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.4", "Microsoft.Azure.KeyVault": "2.0.1-preview", "Microsoft.AspNet.WebApi.Client ":" 5.2.3 "," Microsoft.CrmSdk.CoreAssemblies ":" 9.0.0.7 "}}}}

  9. Если вы используете Visual Studio, товам нужно будет убедиться, что вы добавили вышеупомянутые ссылки в свой проект.

  10. Пожалуйста, посмотрите мой оригинальный пост выше, чтобы увидеть, как я использовал учетные данные в коде и то, как я их изменил сейчасв приведенном ниже коде.

    AuthenticationCredentials authCredentials = new AuthenticationCredentials ();authCredentials.ClientCredentials.UserName.UserName = GetKVSecret ("Secret1", журнал);authCredentials.ClientCredentials.UserName.Password = GetKVSecret ("Secret2", log);

  11. А теперь вот код для функции GetKVSecret.

    private static string GetKVSecret(string secretName, TraceWriter log)
    {
    var adClientId = System.Environment.GetEnvironmentVariable("AppADClientID");
    var adKey = System.Environment.GetEnvironmentVariable("AppADKey");
    var secret = System.Environment.GetEnvironmentVariable(secretName);
    
    var keyVault = new KeyVaultClient(async (string authority, string resource, string scope) => {
    var authContext = new AuthenticationContext(authority);
    var credential = new ClientCredential(adClientId, adKey);
    var token = await authContext.AcquireTokenAsync(resource, credential); 
    return token.AccessToken;
    });
    string returnValue;
    try
    {
        returnValue = keyVault.GetSecretAsync(secret).Result.Value;
        log.Info("Secret retrieved from Key Vault");
    }
    catch (Exception error)
    {
        log.Error("Unable to get secrets from Azure Key Vault.", error);
        throw;
    }
    return returnValue;
    

    }

  12. Последний шаг, вы можете видеть, что я выбираю AppADClientID и AppADKey из конфигурации.Поэтому вам нужно будет создать следующие записи на экране настроек вашего приложения.AppADClientID: значение, полученное на шаге 3AppADKey: значение, которое вы получили на шаге 4secret1: значение, полученное на шаге 2secret2: значение, полученное на шаге 2secret1 и 2 могут различаться в зависимости от количества созданных вами секретов.

Так что есть!Я надеюсь, что вы найдете это полезным, и если у вас есть какие-либо вопросы, пожалуйста, напишите их здесь, я постараюсь ответить на них.Я должен закончить, отдавая должное следующим ресурсам, которые помогли мне на этом пути.

Ссылка 1 Ссылка 2

PS.Это было жалко, чтобы опубликовать решение с кодом.Stackoverflow продолжал препятствовать тому, чтобы я представил, говоря, что у меня был код в окне, которое не было отформатировано правильно.Однако позже я понял, что это «автоматическое» форматирование маркеров на точках маркеров, которое конфликтует с вставками кода.В любом случае, я думаю, что переполнение стека не должно препятствовать публикации, поскольку это может означать, что поставщики контента разочаруются (у нас есть другие оплачиваемые работы!)

...