Azure OAuth: невозможно программно создать приложение с согласия администратора для получения разрешений

#azure #oauth #azure-active-directory #microsoft-graph-api

#azure #oauth #azure-active-directory #microsoft-graph-api

Вопрос:

Я пытаюсь создать приложение Azure AD для OAuth и пытаюсь назначить ему разрешения. Приложение успешно создается, но я не вижу правильно назначенных разрешений.

Ниже приведены шаги, которые я выполняю для создания приложения.

  1. Получил токен доступа, используя поток кода устройства. (https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-device-code )

  2. Создано приложение с использованием следующего фрагмента кода C #

     public async Task CallPostWebApiAndProcessResultAsync(string webApiUrl, string accessToken, string body, Action<JObject> processResult)
    {
        if (!string.IsNullOrEmpty(accessToken))
        {
            var defaultRequetHeaders = HttpClient.DefaultRequestHeaders;
            if (defaultRequetHeaders.Accept == null || !defaultRequetHeaders.Accept.Any(m => m.MediaType == "application/json"))
            {
                HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            }
            defaultRequetHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
    
            HttpContent postContent = new StringContent(body, Encoding.UTF8, "application/json");
            HttpResponseMessage response = await HttpClient.PostAsync(webApiUrl, postContent);
            if (response.IsSuccessStatusCode)
            {
                string json = await response.Content.ReadAsStringAsync();
                JObject result = JsonConvert.DeserializeObject(json) as JObject;
                processResult(result);
            }
            else
            {
                // Error
            }
        }
    }
      

    Параметры вышеуказанной функции следующие:

    • webAPIUrl это: «https://graph.microsoft.com/v1.0/applications «
    • body это : "{ "displayName": "App with permissions in tenant", "requiredResourceAccess": [ { "resourceAppId": "00000003-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "75359482-378d-4052-8f01-80520e7db3cd", "type": "Role" }, { "id": "62a82d76-70ea-41e2-9197-370581804d09", "type": "Role" } ]}]}"

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

Я пытаюсь выделить файлы разрешений Graph API.ReadWrite.Все и группа.ReadWrite.All. Эти разрешения также добавляются, но их статус «Невозможно определить статус». Согласие администратора не предоставляется автоматически.

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

К сожалению, не удалось найти много информации об этом в сети. Пожалуйста, дайте мне знать, если у кого-нибудь есть какие-либо идеи по этому поводу.

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

Ответ №1:

Параметр requiredResourceAccess служит только для объявления того, какое разрешение запрашивает ваше приложение (или требуется, в зависимости от потока). Это не то же самое, что фактически предоставлять эти разрешения. Из документации для свойства requiredResourceAccess объекта приложения:

Коллекция requiredResourceAccess
Определяет ресурсы, к которым требуется доступ для этого приложения, а также набор областей разрешений OAuth и ролей приложений, которые ему нужны для каждого из этих ресурсов. Эта предварительная настройка требуемого доступа к ресурсам обеспечивает получение согласия. Не обнуляется.

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

Кроме того, вы можете использовать Microsoft Graph для предоставления этих разрешений.

Разрешения приложений — это роли приложений. Чтобы предоставить разрешения приложению, необходимо создать назначение роли приложения в коллекции appRoleAssignedTo участника-службы API:

  1. Убедитесь, что для клиентского приложения существует участник службы. Если этого не произойдет (например, потому, что вы только что создали приложение), создайте участника службы. Пусть {principal-id} будет идентификатором объекта servicePrincipal клиентского приложения.
  2. Извлеките участника службы для приложения ресурса (в данном случае, например, API). Пусть {resource-id} будет идентификатором объекта servicePrincipal приложения ресурса.
  3. Найдите идентификатор роли приложения, которую вы хотите предоставить. В этом случае у вас уже есть это (вы использовали его в requiredResourceAccess объекта приложения), но вы также можете найти его в коллекции appRoles объекта servicePrincipal приложения ресурсов. Пусть {app-role-id} будет идентификатор разрешения, которое вы хотите предоставить.
  4. Создайте назначение роли приложения:
     POST https://graph.microsoft.com/v1.0/servicePrincipals/{resource-id}/appRoleAssignedTo
    
    {
      "principalId": "{principal-id}",
      "resourceId": "{resource-id}",
      "appRoleId": "{app-role-id}"
    }
    
      
  5. Повторите шаг 4 для каждой роли приложения (разрешения приложения) для этого API.

Вместо того, чтобы создавать все эти запросы вручную, я рекомендую использовать Microsoft Graph SDK.


ПРЕДУПРЕЖДЕНИЕ
Предоставляя приложению приложения разрешения для Microsoft Graph, вы можете предоставить приложению очень привилегированный доступ к вашей организации и данным организации. Убедитесь, что вы полностью понимаете последствия, прежде чем делать это.

Комментарии:

1. я хочу добавить роль администратора пользователя в свое приложение для удаления пользователей в ad b2c через graph api. Я создал участника приложения и службы, используя шаги 1 и 2. Но в моем принципе обслуживания нет идентификатора назначения роли present.it выглядит как «appRoleAssignmentRequired»: false, «appRoles»: [], как мне получить идентификатор роли?

Ответ №2:

Я считаю, что предоставление согласия администратора — это отдельный шаг, который необходимо выполнить: https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/grant-admin-consent#construct-the-url-for-granting-tenant-wide-admin-consent