图 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。

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" 在您的情况下不为空。 一件事,上面的第二个 link 对 AD 的应用程序访问权限有非常详细的解释。可能对你有帮助。

请参考以下步骤:

  1. 从您的屏幕截图来看,您似乎授予了 Read and write directory data Windows Azure Active Directory(azure ad graph api) 的应用程序权限。由于您使用的是 microsoft graph (https://graph.microsoft.com/) ,因此您需要为 Microsoft Graph 授予应用程序权限:

  2. 由于您是 AAD 的管理员,您可以通过单击上面屏幕截图中显示的 Grant permission 按钮为组织中的用户授予权限。

  3. 然后您可以使用您的代码(客户端凭据流获取令牌)并查询用户信息。如果您检查 azure ad 颁发的访问令牌中的声明,您可以在 roles 声明中找到 Directory.Read.All 权限。

假设您想在 Azure 活动目录中创建组 我必须执行以下步骤来解决这个问题

  1. AD > 已注册应用 > 您的应用
  2. Select 需要权限
  3. 单击“添加”,然后单击 select Microsoft Graph 并添加它
  4. select Microsoft Graph
  5. select 读取和写入委派权限列表中的所有组
  6. 并保存
  7. Select Windows Azure Active Directory 并授予所有应用程序权限
  8. 保存

确保单击“授予权限”,然后对所有用户帐户单击“是”。

在某些情况下,实际问题的发生是因为我们使用 "Application permissions" 而不是 "Delegated permissions"。在我的应用程序中,我试图列出所有具有应用程序权限的用户,但没有成功。当我切换到委派权限时,它起作用了。

所以,一些快速检查是这样的:

  1. 检查您是否使用 Microsoft Graph API 或其他
  2. 使用委派权限
  3. 单击授予权限按钮传播权限:)

希望这会对某人有所帮助。

对我来说解决这个问题的关键是提示:

要将 Graph API 与您的 B2C 租户一起使用,您需要使用 Azure 中的通用应用程序注册菜单(所有服务,默认情况下不是收藏夹星号)注册专用应用程序门户,不是 Azure AD B2C 的应用程序菜单。您不能重复使用在 Azure AD B2C 的应用程序菜单中注册的 already-existing B2C 应用程序。

在页面 AD B2C API access demo

上查找更多信息

通过勾选 '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

就我而言,删除用户不起作用。我采取了以下步骤,它开始为我工作。

前往 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)