Graph API - Недостаточно прав для завершения операции

При попытке получить доступ к клиенту службы графов я получаю сообщение об ошибке:

Код: Authorization_RequestDenied
Сообщение: недостаточно прав для завершения операции.

После исследования этой ошибки наиболее распространенным решением было установить разрешения для API. Это уже было сделано и имеет права на чтение основных / полных профилей.

Я удалил и заново добавил API.

Ниже приведен код в моем AzureAuthenticationProvider класс, который наследуется от IAuthenticationProvider:

public class AzureAuthenticationProvider : IAuthenticationProvider
{
    private string _azureDomain = "myDevDom.onmicrosoft.com";

    public async Task AuthenticateRequestAsync(HttpRequestMessage request)
    {
        try
        {
            string clientId = "2b823c67-1b0d-4a10-a9e1-737142516f5q";
            string clientSecret = "xxxxxx";

            AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/" + _azureDomain + "/oauth2/token");

            ClientCredential credentials = new ClientCredential(clientId, clientSecret);

            AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", credentials);

            request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken);
        }
        catch (Exception ex)
        {
        }
    }
}

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

Код выше, кажется, работает нормально.

Ниже приведен код доступа к Azure AD:

public async Task<IGraphServiceUsersCollectionPage> GetUsersByLastName(string lastname)  
{
    GraphServiceClient graphClient = new GraphServiceClient(new AzureAuthenticationProvider());
    string filter = String.Format("startswith(surname, '{0}')", lastname);
    IGraphServiceUsersCollectionPage users = await graphClient.Users.Request().Filter(filter).GetAsync(); //Fails on this line
    return users;
}

Любая помощь очень ценится, и заранее спасибо за любую помощь. azureADpermissionProperties

14 ответов

Решение

Пожалуйста, обратитесь к ниже шагов:

  1. С вашего скриншота, кажется, вы даете Read and write directory data разрешение на применение для Windows Azure Active Directory(Azure Ad Graph API) . Поскольку вы используете график Microsoft ( https://graph.microsoft.com/), вам необходимо предоставить разрешение приложения для Microsoft Graph: введите описание изображения здесь

  2. Поскольку вы являетесь администратором в своей AAD, вы можете предоставить разрешение для пользователей в организации, нажав Grant permission кнопка показана на скриншоте выше.

  3. Затем вы можете использовать свой код (поток учетных данных клиента для получения токена) и запрашивать информацию о пользователях. Если вы проверите утверждения в токене доступа, выданном рекламой Azure, вы можете найти Directory.Read.All разрешение в roles Запрос.

Предоставить разрешение Убедитесь, что нажмите "Предоставить разрешения", а затем "Да" для всех учетных записей пользователей.

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

Перейти к Azure Active Directory > Roles and administrators > Click on 'User administrator' > click on '+ Add assignment' to add your app. (то есть консольное приложение, использующее AAD Graph REST API для взаимодействия с Azure Active Directory).

Надеюсь, это кому-то поможет.

Для меня ключом к решению этой проблемы был намек:

Чтобы использовать API-интерфейс Graph с вашим клиентом B2C, вам необходимо зарегистрировать отдельное приложение, используя общее меню регистрации приложений (все службы, и там оно по умолчанию не отмечено избранным) на портале Azure, а НЕ в меню приложений Azure AD B2C. Вы не можете повторно использовать уже существующие приложения B2C, которые вы зарегистрировали в меню приложений Azure AD B2C.

Узнайте больше на странице AD B2C демо доступа API

В некоторых случаях настоящая проблема возникает из-за того, что мы используем "Разрешения приложений" вместо "Делегированные разрешения". В моем приложении я попытался перечислить всех пользователей с разрешениями приложения, и это не сработало. Когда я переключился на делегированные разрешения, это сработало.

Итак, некоторая быстрая проверка была бы такой:

  1. Проверьте, используете ли вы Microsoft Graph API или что-то еще
  2. Использовать делегированные разрешения
  3. Нажмите кнопку Предоставить разрешения для распространения разрешений:)

Надеюсь, это кому-нибудь поможет.

Предположим, вы хотите создать группу в Azure Active Directory, мне нужно выполнить следующие шаги, чтобы решить эту проблему

  1. AD > Приложение зарегистрировано> ваше приложение
  2. Выберите необходимое разрешение
  3. Нажмите Добавить, выберите Microsoft Graph и добавьте его.
  4. выберите Microsoft Graph
  5. выберите Чтение и запись всех групп из списка разрешенных разрешений.
  6. И сохранить его
  7. Выберите Windows Azure Active Directory и предоставьте всем приложениям разрешение
  8. Сохрани это

Предоставить разрешения, отметив галочкой "Directory.Read.All / Write", недостаточно.

Я сталкиваюсь с той же проблемой. и решается путем добавления принципа обслуживания к роли администратора.

Если ваше приложение создано недавно, это можно сделать Azure AD Powershell.

$pricinple = Get-AzureADServicePrincipal || Where-Object {$_.DisplayName -eq 'youappname'}

 $role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -eq 'Company Administrator'}

Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $pricinple.ObjectId

подробнее см. https://docs.microsoft.com/en-us/powershell/module/Azuread/Add-AzureADDirectoryRoleMember?view=azureadps-2.0

Если ваше приложение было создано давно, вам нужно будет использовать MSOnline. см.: https://docs.microsoft.com/en-us/powershell/module/msonline/Add-MsolRoleMember?view=azureadps-1.0

Этот ответ предназначен для тех, кто напрямую пытается использовать API.

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

После добавления разрешений я сгенерировал новый токен доступа, используя:

      curl -X POST "https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "client_id=535fb089-9ff3-47b6-9bfb-4f1264799865" \
     -d "scope=https%3A%2F%2Fgraph.microsoft.com%2F.default" \
     -d "client_secret=qWgdYAmab0YSkuL1qKv5bPX" \
     -d "grant_type=client_credentials"

И использовал его в API, как показано ниже:

      curl -X GET "https://graph.microsoft.com/v1.0/users" \
     -H "Authorization: Bearer {access-token}"

Похоже, что у вашего приложения недостаточно прав для доступа к информации AD. Вы можете выполнить шаги, указанные в ссылке / статье ниже, чтобы войти на портал Azure и посмотреть, достаточно ли у вашего приложения прав для доступа к AD.

http://www.morgantechspace.com/2016/01/graph-api-insufficient-privileges-to-complete-the-operation.html

https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet

Также я надеюсь, что "authResult.AccessToken" не является нулевым в вашем случае. Одна вещь, вторая ссылка выше, содержит очень подробное объяснение прав доступа приложений к AD. может быть полезным для вас.

я использую Credentials flow https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow, и моя проблема была установлена Delegate Permissions вместо Application Permission.

Мне не удалось получить пользователя, потому что я не использовал User.Read.All из Application Permissions https://docs.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&amp;tabs=http

Application User.Read.All, User.ReadWrite.All, Directory.Read.All, Directory.ReadWrite.All

Перейдите на портал Azure -> Active Directory -> Регистрация приложений -> Выберите свое приложение -> Разрешения API.

Теперь нажмите «Добавить разрешение» и выберите Microsoft Graph, выберите «Разрешение приложения» и найдите User.Read.All.

Добавьте эти разрешения в свое приложение, и оно должно работать.

Мне пришлось добавить в токен все « группы » (ID, Access, SAML) . Это можно настроить в конфигурации токена Azure Active Directory и проверить через .https://jwt.io/

вы должны предоставить роль Directory.Read субъекту-службе на странице AD, а не странице регистрации приложения.

кстати. Я использую python sdk azure-graphrbac с serviceprincipal из msrestazure.azure_active_directory import ServicePrincipalCredentials

          credential = ServicePrincipalCredentials(ServicePrincipal_APP_ID,ServicePrincipal_SECRET_VALUE,tenant=ServicePrincipal_TENANT_ID,resource="https://graph.windows.net/")
    self.client=GraphRbacManagementClient(credential,TENANT_ID,base_url)

Мне необходимо предоставить разрешения, регистрацию приложений -> Ваше приложение -> Разрешения API ->+ Добавить разрешение ->Microsoft Graph-> Разрешения приложений -> Directory.Read.All и Directory.ReadWrite.All (по мере необходимости). Наконец, предоставьте согласие администратора для вашего клиента

Directory.Read.. разрешение

Предоставить согласие администратора

Но, кроме того, мне нужно было установить назначения в "Роли и администраторы" -> Поиск "Администратор пользователей" -> Добавить назначения, а затем в поле поиска ввести имя зарегистрированного приложения в поле поиска (WebApp - это мой кейс). Наконец нажмите Добавить. Это дает приложению назначение ServicePrincipal.

Назначение администратора

Другие вопросы по тегам