【问题标题】:Graph API - Insufficient privileges to complete the operationGraph API - 权限不足,无法完成操作
【发布时间】:2017-11-03 13:09:24
【问题描述】:

当我尝试访问图形服务客户端时收到错误消息:

代码: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)
        {
        }
    }
}

我尝试将客户端密钥更改为无效的 ID,但它引发了错误,因此客户端密钥是正确的。我还尝试通过更改访问令牌来验证访问令牌是否有效,这也会返回错误。

上面的代码似乎工作正常。

下面是我尝试访问 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;
}

非常感谢任何帮助,并提前感谢您的帮助。

【问题讨论】:

  • 您具体添加了哪些权限?能发个截图吗?您需要的是应用程序权限来读取用户。
  • 感谢您在应用程序权限下的建议,我选择了“读取和写入目录数据”,在委派权限下,我有“登录并读取用户个人资料”“真实所有用户的基本个人资料”和'以登录用户身份访问 firectory'。尽管为了在开发应用程序中进行测试,我选择了所有可用选项,但仍然出现身份验证错误。
  • 委派权限对于此 API 调用无关紧要。您正在执行仅应用程序调用(指定客户端 ID 和密码)。您是否也授予了权限?您可以检查访问令牌内容,例如jwt.io
  • @juunas 我同意委派权限,我已经在此之上设置了应用程序权限(用于读取和写入目录数据) - 我刚刚用屏幕截图剪掉了标题。尝试授予权限时,我收到一条错误消息,指出“未能授予应用程序权限”。我猜这可能是问题所在?感谢您的帮助。
  • 有时可能需要几分钟。最好的方法是检查 jwt.io 中的访问令牌。具体来说,查看令牌中的范围。你应该有类似 Directory.ReadWrite.All 的东西。

标签: c# azure permissions azure-active-directory azure-ad-graph-api


【解决方案1】:

请参考以下步骤:

  1. 从您的屏幕截图中,您似乎授予了 Read and write directory dataWindows 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 权限。

【讨论】:

  • 感谢您的帮助。很抱歉与屏幕截图混淆,但我实际上也授予了 Microsoft graph 的权限。我认为问题可能是我不是管理员,虽然我选择了应用程序的权限,但我无法授予权限(我收到一条错误消息,指出“未能授予应用程序权限”。我是目前正在测试这个,我是 azure AD 的管理员。再次感谢您的建议。
【解决方案2】:

确保为所有用户帐户点击“Grant Permissions”,然后点击“是”。

【讨论】:

    【解决方案3】:

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

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

    AD B2C API access demo页面上查找更多信息

    【讨论】:

      【解决方案4】:

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

      转到Azure Active Directory &gt; Roles and administrators &gt; Click on 'User administrator' &gt; click on '+ Add assignment' to add your app。 (即使用 AAD Graph REST API 与 Azure Active Directory 交互的控制台应用程序)。

      希望对某人有所帮助。

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            您的应用似乎没有足够的权限访问 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 的访问权限进行了非常详细的解释。可能对你有帮助。

            【讨论】:

            • 访问令牌不为空,看起来有效。如果我在运行时更改访问令牌,我会得到一个不同的错误,表明该方法返回的访问令牌是正确的。我已在我的 OP 中添加了屏幕截图。谢谢
            【解决方案8】:

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

            【讨论】:

            • 你不想这样 - 如果你授予它全局管理员权限只是为了阅读用户,它正在使用大锤敲钉子
            • 虽然我同意@LeeM,但这实际上是使其工作的唯一方法。并且在我可以在 Microsoft 文档中找到的任何地方都没有提到。谢谢朗吉
            • 这只是供以后的读者参考,但重要的是要确定究竟什么似乎需要全局管理员。您可能需要 GA 最初授予应用程序身份适当的权限给用户。之后,为了简单地读取用户属性,应用程序不需要 GA。即使授予用户管理员更好,但如果应用程序不执行写入,这应该是尝试解决问题的一部分。几乎所有的每用户管理任务都不需要 GA。当然对于我管理的任何一个,包括用户/邮箱/组创建、MFA/SSPR 等。
            【解决方案9】:

            我正在使用Credentials flow https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow 我的问题是设置Delegate Permissions 而不是Application Permission

            我无法获取用户,因为我没有使用来自 Application PermissionsUser.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

            【讨论】:

              【解决方案10】:

              我必须将所有“”(ID、访问、SAML)添加到令牌中。 这可以在 Azure Active Directory 令牌配置中进行配置,并通过https://jwt.io/ 进行检查。

              【讨论】:

                【解决方案11】:

                您应该将 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)
                

                【讨论】:

                  最近更新 更多