Вызов функции azure, защищенной AAD с использованием идентификатора клиента и секрета клиента - PullRequest
0 голосов
/ 31 января 2020

У меня есть функция Azure, защищенная Azure Active Directory.

Я могу успешно вызвать приложение из браузера при условии, что я вошел в систему.

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

Я пытался использовать для этой цели то же самое приложение (скажем, ApplicationA ), которое было создано для защиты приложения функции. Я зашел в раздел «Регистрация приложений», нашел приложение, созданное путем настройки Azure провайдера аутентификации Active Directory в настройках аутентификации / авторизации приложения функции ( ApplicationA ), и установил для него секрет клиента.

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

Но когда я пытаюсь вызвать функцию с использованием этого токена, я получаю ошибку 401.

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

Я даже пытался добавьте Роль Reader для этого приложения в Подписках, но затем снова - 401 при вызове Function с токеном.

Я знаю, что-то вроде разрешений API в настройках приложения. Поэтому я попытался добавить разрешение для ApplicationB в ApplicationA user_impersonation, но оно также не работает, так что это не так.

Так как мне предоставить разрешение для зарегистрированного приложения, для которого я могу получить токен, чтобы я мог использовать этот токен для вызова функции?

EDIT:

Я использую следующий код для получения токена:

using Microsoft.Identity.Client;

string ClientId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
string ClientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
string TenantId = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
string Authority = $"https://login.microsoftonline.com/{TenantId}";
string[] scopes = new string[] { "https://graph.microsoft.com/.default" };

IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(ClientId)
    .WithClientSecret(ClientSecret)
    .WithAuthority(new Uri(Authority))
    .Build();

AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync();

string token = result.AccessToken;

1 Ответ

0 голосов
/ 31 января 2020

Вам необходимо зарегистрировать хотя бы одно разрешение приложения (appRole с разрешенным типом элемента Application) через манифест в регистрацию приложения функций. Затем вы можете назначить разрешение приложения клиентскому приложению.

Более подробную информацию об определении разрешений можно найти в моей статье: https://joonasw.net/view/defining-permissions-and-roles-in-aad

Пример разрешения приложения в манифесте :

"appRoles": [
  {
    "allowedMemberTypes": [
      "Application"
    ],
    "description": "Allow the application to read all things as itself.",
    "displayName": "Read all things",
    "id": "32028ccd-3212-4f39-3212-beabd6787d81",
    "isEnabled": true,
    "lang": null,
    "origin": "Application",
    "value": "Things.Read.All"
  }
],

Вы должны определить идентификатор самостоятельно, это просто должен быть GUID. value - это то, что отправляется в токенах в заявке roles. Описание и отображаемое имя предназначены только для отображения разрешений в пользовательском интерфейсе.

...