#azure #oauth #azure-active-directory #microsoft-graph-api
#azure #oauth #azure-active-directory #microsoft-graph-api
Вопрос:
Я пытаюсь создать приложение Azure AD для OAuth и пытаюсь назначить ему разрешения. Приложение успешно создается, но я не вижу правильно назначенных разрешений.
Ниже приведены шаги, которые я выполняю для создания приложения.
-
Получил токен доступа, используя поток кода устройства. (https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-device-code )
-
Создано приложение с использованием следующего фрагмента кода 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:
- Убедитесь, что для клиентского приложения существует участник службы. Если этого не произойдет (например, потому, что вы только что создали приложение), создайте участника службы. Пусть
{principal-id}
будет идентификатором объекта servicePrincipal клиентского приложения. - Извлеките участника службы для приложения ресурса (в данном случае, например, API). Пусть
{resource-id}
будет идентификатором объекта servicePrincipal приложения ресурса. - Найдите идентификатор роли приложения, которую вы хотите предоставить. В этом случае у вас уже есть это (вы использовали его в requiredResourceAccess объекта приложения), но вы также можете найти его в коллекции appRoles объекта servicePrincipal приложения ресурсов. Пусть
{app-role-id}
будет идентификатор разрешения, которое вы хотите предоставить. - Создайте назначение роли приложения:
POST https://graph.microsoft.com/v1.0/servicePrincipals/{resource-id}/appRoleAssignedTo { "principalId": "{principal-id}", "resourceId": "{resource-id}", "appRoleId": "{app-role-id}" }
- Повторите шаг 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