图 API - 权限不足,无法完成操作
Graph API - Insufficient privileges to complete the operation
尝试使用我收到的错误访问图形服务客户端时:
Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.
研究此错误后,最常见的解决方案是为 API 设置权限。这已经完成并且有权读取 basic/full 个配置文件。
我删除并重新添加了 API。
下面是我的 AzureAuthenticationProvider
class 中继承自 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)
{
}
}
}
我已尝试将客户端密码更改为无效的 ID,但出现错误,因此客户端密钥是正确的。我还尝试通过更改访问令牌来验证访问令牌是否有效,这也是 returns 一个错误。
上面的代码似乎工作正常。
下面是我尝试访问 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;
}
非常感谢任何帮助,并在此先感谢您的帮助。
您的应用程序似乎没有足够的权限访问 AD 信息。您可以按照下面提到的步骤 link/article 登录到 Azure 门户,看看您的应用程序是否有足够的权限访问 AD。
我也希望 "authResult.AccessToken" 在您的情况下不为空。
一件事,上面的第二个 link 对 AD 的应用程序访问权限有非常详细的解释。可能对你有帮助。
请参考以下步骤:
从您的屏幕截图来看,您似乎授予了 Read and write directory data
Windows Azure Active Directory
(azure ad graph api) 的应用程序权限。由于您使用的是 microsoft graph (https://graph.microsoft.com/) ,因此您需要为 Microsoft Graph
授予应用程序权限:
由于您是 AAD 的管理员,您可以通过单击上面屏幕截图中显示的 Grant permission
按钮为组织中的用户授予权限。
然后您可以使用您的代码(客户端凭据流获取令牌)并查询用户信息。如果您检查 azure ad 颁发的访问令牌中的声明,您可以在 roles
声明中找到 Directory.Read.All
权限。
假设您想在 Azure 活动目录中创建组
我必须执行以下步骤来解决这个问题
- AD > 已注册应用 > 您的应用
- Select 需要权限
- 单击“添加”,然后单击 select Microsoft Graph 并添加它
- select Microsoft Graph
- select 读取和写入委派权限列表中的所有组
- 并保存
- Select Windows Azure Active Directory 并授予所有应用程序权限
- 保存
确保单击“授予权限”,然后对所有用户帐户单击“是”。
在某些情况下,实际问题的发生是因为我们使用 "Application permissions" 而不是 "Delegated permissions"。在我的应用程序中,我试图列出所有具有应用程序权限的用户,但没有成功。当我切换到委派权限时,它起作用了。
所以,一些快速检查是这样的:
- 检查您是否使用 Microsoft Graph API 或其他
- 使用委派权限
- 单击授予权限按钮传播权限:)
希望这会对某人有所帮助。
对我来说解决这个问题的关键是提示:
要将 Graph API 与您的 B2C 租户一起使用,您需要使用 Azure 中的通用应用程序注册菜单(所有服务,默认情况下不是收藏夹星号)注册专用应用程序门户,不是 Azure AD B2C 的应用程序菜单。您不能重复使用在 Azure AD B2C 的应用程序菜单中注册的 already-existing B2C 应用程序。
上查找更多信息
通过勾选 '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
如果您的应用程序是很久以前创建的,您将需要使用 MSOnline。
参见:https://docs.microsoft.com/en-us/powershell/module/msonline/Add-MsolRoleMember?view=azureadps-1.0
就我而言,删除用户不起作用。我采取了以下步骤,它开始为我工作。
前往 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 交互)。
希望对大家有所帮助。
我正在使用 Credentials flow
https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow
我的问题是设置 Delegate Permissions
而不是 Application Permission
.
我无法获得用户,因为我没有使用 Application Permissions
中的 User.Read.All
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
我必须将所有“组”(ID、访问、SAML)添加到令牌中。
这可以在 Azure Active Directory 令牌配置中配置并通过 https://jwt.io/.
检查
您应该将 Directory.Read 角色授予 AD 页面中的服务主体,而不是应用程序注册页面。
顺便说一句。我正在使用 python sdk azure-graphrbac 和 serviceprincipal
从 msrestazure.azure_active_directory 导入 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)
尝试使用我收到的错误访问图形服务客户端时:
Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.
研究此错误后,最常见的解决方案是为 API 设置权限。这已经完成并且有权读取 basic/full 个配置文件。
我删除并重新添加了 API。
下面是我的 AzureAuthenticationProvider
class 中继承自 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)
{
}
}
}
我已尝试将客户端密码更改为无效的 ID,但出现错误,因此客户端密钥是正确的。我还尝试通过更改访问令牌来验证访问令牌是否有效,这也是 returns 一个错误。
上面的代码似乎工作正常。
下面是我尝试访问 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;
}
非常感谢任何帮助,并在此先感谢您的帮助。
您的应用程序似乎没有足够的权限访问 AD 信息。您可以按照下面提到的步骤 link/article 登录到 Azure 门户,看看您的应用程序是否有足够的权限访问 AD。
我也希望 "authResult.AccessToken" 在您的情况下不为空。 一件事,上面的第二个 link 对 AD 的应用程序访问权限有非常详细的解释。可能对你有帮助。
请参考以下步骤:
从您的屏幕截图来看,您似乎授予了
Read and write directory data
Windows Azure Active Directory
(azure ad graph api) 的应用程序权限。由于您使用的是 microsoft graph (https://graph.microsoft.com/) ,因此您需要为Microsoft Graph
授予应用程序权限:由于您是 AAD 的管理员,您可以通过单击上面屏幕截图中显示的
Grant permission
按钮为组织中的用户授予权限。然后您可以使用您的代码(客户端凭据流获取令牌)并查询用户信息。如果您检查 azure ad 颁发的访问令牌中的声明,您可以在
roles
声明中找到Directory.Read.All
权限。
假设您想在 Azure 活动目录中创建组 我必须执行以下步骤来解决这个问题
- AD > 已注册应用 > 您的应用
- Select 需要权限
- 单击“添加”,然后单击 select Microsoft Graph 并添加它
- select Microsoft Graph
- select 读取和写入委派权限列表中的所有组
- 并保存
- Select Windows Azure Active Directory 并授予所有应用程序权限
- 保存
在某些情况下,实际问题的发生是因为我们使用 "Application permissions" 而不是 "Delegated permissions"。在我的应用程序中,我试图列出所有具有应用程序权限的用户,但没有成功。当我切换到委派权限时,它起作用了。
所以,一些快速检查是这样的:
- 检查您是否使用 Microsoft Graph API 或其他
- 使用委派权限
- 单击授予权限按钮传播权限:)
希望这会对某人有所帮助。
对我来说解决这个问题的关键是提示:
要将 Graph API 与您的 B2C 租户一起使用,您需要使用 Azure 中的通用应用程序注册菜单(所有服务,默认情况下不是收藏夹星号)注册专用应用程序门户,不是 Azure AD B2C 的应用程序菜单。您不能重复使用在 Azure AD B2C 的应用程序菜单中注册的 already-existing B2C 应用程序。
上查找更多信息通过勾选 '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
如果您的应用程序是很久以前创建的,您将需要使用 MSOnline。 参见:https://docs.microsoft.com/en-us/powershell/module/msonline/Add-MsolRoleMember?view=azureadps-1.0
就我而言,删除用户不起作用。我采取了以下步骤,它开始为我工作。
前往 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 交互)。
希望对大家有所帮助。
我正在使用 Credentials flow
https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow
我的问题是设置 Delegate Permissions
而不是 Application Permission
.
我无法获得用户,因为我没有使用 Application Permissions
中的 User.Read.All
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
我必须将所有“组”(ID、访问、SAML)添加到令牌中。 这可以在 Azure Active Directory 令牌配置中配置并通过 https://jwt.io/.
检查您应该将 Directory.Read 角色授予 AD 页面中的服务主体,而不是应用程序注册页面。
顺便说一句。我正在使用 python sdk azure-graphrbac 和 serviceprincipal 从 msrestazure.azure_active_directory 导入 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)