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;
}
Любая помощь очень ценится, и заранее спасибо за любую помощь.
14 ответов
Пожалуйста, обратитесь к ниже шагов:
С вашего скриншота, кажется, вы даете
Read and write directory data
разрешение на применение дляWindows Azure Active Directory
(Azure Ad Graph API) . Поскольку вы используете график Microsoft ( https://graph.microsoft.com/), вам необходимо предоставить разрешение приложения дляMicrosoft Graph
:Поскольку вы являетесь администратором в своей AAD, вы можете предоставить разрешение для пользователей в организации, нажав
Grant permission
кнопка показана на скриншоте выше.Затем вы можете использовать свой код (поток учетных данных клиента для получения токена) и запрашивать информацию о пользователях. Если вы проверите утверждения в токене доступа, выданном рекламой 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
В некоторых случаях настоящая проблема возникает из-за того, что мы используем "Разрешения приложений" вместо "Делегированные разрешения". В моем приложении я попытался перечислить всех пользователей с разрешениями приложения, и это не сработало. Когда я переключился на делегированные разрешения, это сработало.
Итак, некоторая быстрая проверка была бы такой:
- Проверьте, используете ли вы Microsoft Graph API или что-то еще
- Использовать делегированные разрешения
- Нажмите кнопку Предоставить разрешения для распространения разрешений:)
Надеюсь, это кому-нибудь поможет.
Предположим, вы хотите создать группу в Azure Active Directory, мне нужно выполнить следующие шаги, чтобы решить эту проблему
- AD > Приложение зарегистрировано> ваше приложение
- Выберите необходимое разрешение
- Нажмите Добавить, выберите Microsoft Graph и добавьте его.
- выберите Microsoft Graph
- выберите Чтение и запись всех групп из списка разрешенных разрешений.
- И сохранить его
- Выберите Windows Azure Active Directory и предоставьте всем приложениям разрешение
- Сохрани это
Предоставить разрешения, отметив галочкой "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.
Также я надеюсь, что "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&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 (по мере необходимости). Наконец, предоставьте согласие администратора для вашего клиента
Но, кроме того, мне нужно было установить назначения в "Роли и администраторы" -> Поиск "Администратор пользователей" -> Добавить назначения, а затем в поле поиска ввести имя зарегистрированного приложения в поле поиска (WebApp - это мой кейс). Наконец нажмите Добавить. Это дает приложению назначение ServicePrincipal.