Аутентификация приложения-функции Azure для подключения к Dynamics 365 CRM онлайн
Иногда вам нужно знать ответ, чтобы задать правильный вопрос, поэтому я не уверен, что заголовок этого запроса идеален. Во всяком случае здесь идет.
Я разработал приложение-функцию 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 работает, я хочу найти способ аутентификации Function Function в Azure AD (вместо передачи учетных данных в коде) и получить маркер доступа, который я могу использовать для создания моего OrganisationServiceProxy, но как это сделать? Я иду об этом. Я не могу найти прямой ответ там. Множество ответов в архитектурном стиле находятся в облаках. Мне нужны ответы в стиле разработчика (сделайте это, затем сделайте это):)
Я уверен, что многие разработчики новичков Azure найдут это полезным знать. Заранее спасибо.
Примечание для редакторов. Этот вопрос отличается от проверки подлинности с помощью Dynamics 365 из функции Azure, поскольку я использую тот же клиент и подписку, используя временные триггеры, а не веб-хуки. Мое функциональное приложение просыпается, подключается к CRM, выполняет некоторые вычисления, обновляет CRM и возвращается в спящий режим.
1 ответ
Мне удалось защитить свои учетные данные с помощью хранилища ключей Azure. Для тех новичков, которые хотят сделать то же самое... вот шаги.
- Войдите на портал Azure и создайте хранилище ключей или, если оно у вас уже есть, перейдите к следующему шагу.
- После создания хранилища ключей перейдите в раздел секретов хранилища ключей. Теперь вы создадите секрет для каждого удостоверения, которое вам нужно защитить. В моем случае я создал секрет для имени пользователя и еще один для пароля. Каждый раз, когда вы создаете секрет, Azure будет выдавать вам секретный идентификатор. Запишите это, так как вы позже будете использовать это в настройках конфигурации функции Azure.
- Затем вам нужно перейти в Azure Active Directory (Azure AD). Вам нужно перейти к регистрации приложений и создать новую регистрацию приложения. На данном этапе не имеет значения, создали ли вы свое функциональное приложение или нет. Этот шаг просто информирует Azure AD о том, что у вас есть приложение, которое вы хотите зарегистрировать, чтобы оно могло выдать вам идентификатор приложения. При создании регистрации приложения вам нужно будет записать выданный идентификатор приложения. Опять же, вы будете использовать это в настройках конфигурации приложения функции.
- В Azure AD при регистрации приложений нажмите "Ключи" и создайте новый ключ. Как только вы создадите ключ, Azure предоставит вам значение ключа. (Запомните это значение, так как это единственное время, когда Azure покажет вам это значение.) Вам также понадобится этот ключ приложения в настройках конфигурации приложения функции Azure.
- Вернитесь в хранилище ключей Azure и в хранилище ключей, которое вы создали. На этот раз нажмите на Политики доступа. То, что вы здесь делаете, позволяет вашему приложению с зарегистрированной функцией Azure AD подключаться к этому хранилищу ключей. Нажмите "Добавить новый", затем выберите принципала, найдите приложение, зарегистрированное в Azure AD (не выбирайте функциональное приложение, которое также будет отображаться здесь, вам нужно выбрать то же имя, которое вы зарегистрировали в Azure AD на шаге 3 выше). Затем в секретные разрешения, выберите "Получить" и нажмите "Сохранить".
- Вот настройка сделана. Остальные изменения кода, чтобы все это работало.
Добавьте следующие операторы использования в начало вашего кода.
использование Microsoft.Azure.KeyVault;
использование Microsoft.IdentityModel.Clients.ActiveDirectory;Если код вашего функционального приложения находится на портале 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 "}}}}
Если вы используете Visual Studio, то вам необходимо убедиться, что вы добавили вышеупомянутые ссылки в свой проект.
Пожалуйста, посмотрите мой оригинальный пост выше, чтобы увидеть, как я использовал учетные данные в коде и как я их изменил в коде ниже.
AuthenticationCredentials authCredentials = new AuthenticationCredentials (); authCredentials.ClientCredentials.UserName.UserName = GetKVSecret ("Secret1", журнал); authCredentials.ClientCredentials.UserName.Password = GetKVSecret("Secret2", журнал);
А теперь вот код для функции 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;
}
Последний шаг, вы можете видеть, что я выбираю AppADClientID и AppADKey из конфигурации. Поэтому вам нужно будет создать следующие записи на экране настроек вашего приложения.
AppADClientID: значение, полученное на шаге 3
AppADKey: значение, которое вы получили на шаге 4
secret1: значение, полученное на шаге 2
secret2: значение, которое вы получили на шаге 2
secret1 и 2 могут отличаться в зависимости от количества секретов, которые вы создали.
Так что! Я надеюсь, что вы найдете это полезным, и если у вас есть какие-либо вопросы, пожалуйста, напишите их здесь, я постараюсь ответить на них. Я должен закончить, отдавая должное следующим ресурсам, которые помогли мне на этом пути.
PS. Это было жалко, чтобы опубликовать решение с кодом. Stackru продолжал препятствовать тому, чтобы я представил, говоря, что у меня был код в окне, которое не было отформатировано правильно. Однако позже я понял, что это "автоматическое" форматирование маркеров в точках маркера, которое конфликтует с вставками кода. В любом случае, я думаю, что переполнение стека не должно препятствовать публикации, поскольку это может означать, что поставщики контента разочаруются (у нас есть другие оплачиваемые работы!)