Graph API - 权限不足,无法完成操作

Posted

技术标签:

【中文标题】Graph API - 权限不足,无法完成操作【英文标题】:Graph API - Insufficient privileges to complete the operation 【发布时间】: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 的东西。 【参考方案1】:

请参考以下步骤:

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

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

    然后您可以使用您的代码(客户端凭据流来获取令牌)并查询用户信息。如果您查看 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】:

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

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

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案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)

【讨论】:

以上是关于Graph API - 权限不足,无法完成操作的主要内容,如果未能解决你的问题,请参考以下文章

使用Graph API 操作OneDrive 文件 权限 共享

使用 Facebook Graph 权限的 Instagram API

Facebook Graph API 2.5 - 无法访问好友

雪花:SQL 访问控制错误:权限不足,无法对架构进行操作

无法在Logic Apps调用Graph API中设置hideFromAddressLists

MS Graph Api 读取授予权限的用户