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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Подробнее на странице AD B2C API демо-доступ

Ответ 4

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

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

  • Проверьте, используете ли вы API-интерфейс Microsoft Graphic или что-то еще
  • Использовать делегированные разрешения
  • Нажмите Предоставить разрешения для распространения разрешений:)

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

Ответ 5

Похоже, ваше приложение не имеет достаточных прав на доступ к информации 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. может помочь вам.

Ответ 6

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

  • AD > App Registered > ваше приложение
  • Выберите необходимое разрешение
  • Нажмите "Добавить" и выберите "График Microsoft" и добавьте его
  • выберите Microsoft Graph
  • выберите "Чтение и запись всех групп из списка делегированных разрешений"
  • И сохраните его
  • Выберите Windows Azure Active Directory и предоставите все права приложения.
  • Сохранить

Ответ 7

Предоставить разрешения, отметив галочкой "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