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
Пожалуйста, обратитесь к ниже шагов:
-
Из вашего скриншота видно, что вы предоставляете разрешение на 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]()
-
Поскольку вы являетесь администратором AAD, вы можете предоставить разрешение пользователям в организации, нажав кнопку " Grant permission
, показанную на снимке экрана выше.
-
Затем вы можете использовать свой код (поток учетных данных клиента для получения токена) и запрашивать информацию о пользователях. Если вы проверите утверждения в маркере доступа, выданном Azure Ad, вы можете найти разрешение Directory.Read.All
в утверждении roles
.
Ответ 2
Убедитесь, что нажмите " Предоставить разрешения " и затем "Да" для всех учетных записей пользователей.
Ответ 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