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 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
权限。
【讨论】:
感谢您的帮助。很抱歉与屏幕截图混淆,但我实际上也授予了 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 > Roles and administrators > Click on 'User administrator' > 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 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
【讨论】:
【参考方案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 - 无法访问好友