Функция Azure с использованием MSI - ошибка запроса токена

У меня есть функция в Azure, в которой включен MSI (управляемая идентификация службы), которую я пытаюсь использовать для доступа к веб-интерфейсу на основе Azure (веб-приложение службы приложений), в котором, в свою очередь, включена аутентификация Azure AD (все тот же каталог Azure).

В моем WebAPI зарегистрировано приложение Azure, поэтому оно может использовать аутентификацию AAD.

Это приложение также имеет необходимые AppRoles, настроенные в его манифесте (для типов «Пользователь» и «Приложение»).

Я также подтвердил, что удостоверение функций (приложение) было успешно создано в Azure AD, когда я включил MSI для функции.

Когда я пытаюсь получить токен в своей функции с помощью MSI, я получаю ответ / ошибку 400 Bad Request:

ExceptionMessage: AADSTS50105: приложению '###' не назначена роль для приложения '###'

Код ошибки: invalid_grant

Я убедился, что значение ресурса, которое я передаю, является URI идентификатора моего приложения webAPIs.

string resource = "<My App URI>";
string apiversion = "2017-09-01";
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
var r = await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion));
return r;

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

Единственное, что я не смог сделать (и я предполагаю, что это проблема), так это найти способ добавить новый идентификатор MSI / функции для пользователей и групп приложения Azure webAPI. Независимо от того, что я пробую, мое удостоверение приложения с функциями не отображается в списке пользователей, когда я ищу его для добавления в качестве члена приложения webAPI (с ролью приложения).

Есть ли у кого-нибудь предложения относительно того, почему я не могу добавить MSI-файл функций в группу «Пользователи и группы приложений» или в группу Azure AD?

Или, может быть, я еще что-то делаю не так?


person cty    schedule 04.04.2018    source источник
comment
Вы должны добавить разрешение приложения для субъекта-службы функции :) Роли приложения с разрешенным типом члена == Приложение являются разрешениями приложения. Я лично этого не пробовал. Сложность заключается в том, что, поскольку у вас нет приложения (только SP), вы должны назначать разрешения с помощью PowerShell.   -  person juunas    schedule 04.04.2018
comment
Команда должна быть примерно такой: New-AzureADServiceAppRoleAssignment -ObjectId 'a' -Id 'a' -PrincipalId 'a' -ResourceId 'a'. Я думаю ObjectId может быть случайным GUID, например [System.Guid]::NewGuid().ToString(). Id должен быть идентификатором приложения. PrincipalId должен быть objectId участника службы функции. ResourceId должен быть objectId участника службы API. Дайте мне знать, если это сработает: D   -  person juunas    schedule 04.04.2018
comment
Вы можете увидеть свое функциональное приложение в лазурной рекламе (я думаю, это должен быть пользователь) ??   -  person Thomas    schedule 05.04.2018
comment
Томас - Да, это там, вы не видите его в разделе «Пользователи», но вы увидите его в разделе «Корпоративные приложения» (необходимо сбросить фильтр поиска, как в ответе / изображении Шэнбао ниже)   -  person cty    schedule 05.04.2018
comment
Юунас - это сработало! Вы были на высоте, спасибо! Я не видел, чтобы это упоминалось где-либо еще в том, что я читал. MS указывает, что вы можете сделать все это с портала Azure, но, как мы убедились, вы не можете! Спасибо за помощь!   -  person cty    schedule 05.04.2018


Ответы (2)


Джуна был замечен в его ответ на мое исходное сообщение:

При включении MSI для службы в Azure AD создается только субъект-служба, поэтому он не будет отображаться в результатах поиска при попытке добавить SP в качестве члена группы или пользователей и групп приложения Azure AD.

Чтобы назначить вашему приложению права участника-службы, созданного MSI, вам необходимо:

  1. Измените манифест приложения и убедитесь, что у вас есть роли приложения с разрешенным типом члена = "Приложение".
  2. Запустите командлет PowerShell "New-AzureADServiceAppRoleAssignment (ссылка), чтобы предоставить своему субъекту-службе роль приложения, которую вы добавили в манифест приложения.
  3. В вашей службе с поддержкой MSI повторите попытку запроса токена

Что касается меня, следуя вышеизложенному, я теперь могу успешно запрашивать токены приложений из моей функции, чтобы моя функция Azure могла вызывать мое веб-приложение (с включенной аутентификацией AAD).

person cty    schedule 05.04.2018

Фактически, когда вы включаете MSI, он создает субъект-службу (а не пользователя), поэтому вы не можете найти его в «Пользователи и группы».

Вы можете найти его на портале Azure и попытаться предоставить необходимые разрешения. Azure Active Directory -> _ 2_

введите здесь описание изображения

Примечание. Имя участника-службы совпадает с именем вашей функции.

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

using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
// ...
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/");
// OR
var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
person Shui shengbao    schedule 05.04.2018
comment
Я вижу субъекта-службы в корпоративных приложениях, который был создан путем включения MSI для функции. Но участник недоступен для приложения Azure в его «Пользователи и группы». Я попытался выполнить поиск по имени участника и его AppID, даже по идентификатору объекта, но, к сожалению, он все еще не отображается в раскрывающемся меню - person cty; 05.04.2018
comment
Это зр, а не пользователь, поэтому вы не смогли его найти. - person Shui shengbao; 05.04.2018
comment
Привет, Шэнбао, вы правы, SP не является пользователем и поэтому не будет отображаться в результатах поиска только через экран корпоративных приложений и с помощью PowerShell. Спасибо! - person cty; 05.04.2018
comment
Привет, если мой ответ поможет, не забудьте принять его как ответ. Спасибо. - person Shui shengbao; 09.04.2018