Microsoft Graph API - 没有足够的权限来完成操作

时间:2017-08-30 00:47:28

标签: microsoft-graph

我正在尝试使用Microsoft Graph API更新Active Directory中的其他用户。

我在https://apps.dev.microsoft.com/

为用户和应用设置了以下权限

我已经请求了以下范围:

  • Directory.ReadWrite.All
  • User.ReadWrite.All
  • Group.ReadWrite.All

我能够获取目录中所有用户的列表,但在尝试更新时(在这种情况下,city),它会失败:

GraphServiceClient graphClient = SDKHelper.GetAuthenticatedClient ();
var usersResponse = graphClient.Users.Request ().GetAsync ();
var users = usersResponse.Result;

// hard coding user id for now
var userId = "9a5b83cd-85ff-4ad1-ab2f-b443941a518e";

var user = users.FirstOrDefault (m => m.Id == userId);
if (user != null) {
    user.City = "New York";
    await graphClient.Me.Request ().UpdateAsync (user);
}

我明白了:

{
    Code : Authorization_RequestDenied
    Message : Insufficient privileges to complete the operation.
    Inner error
}

我登录的用户是该目录的全局管理员。

我拿了JWT令牌,前往https://jwt.io,这些是我看到的角色:

  • Directory.Read.All
  • Directory.ReadWrite.All
  • Files.ReadWrite
  • Group.ReadWrite.All
  • Mail.Send
  • User.Read
  • User.Read.All
  • User.ReadWrite.All

我是否需要其他权限才能实现此目的?

在一天结束时,我想创建一个控制台应用程序(不是Web应用程序),我可以更新目录中的其他用户信息。但我认为使用微软提供的这个示例应用程序是一个良好的开端。

1 个答案:

答案 0 :(得分:3)

您之所以看到这一点,是因为您传递的是完整的user对象,而不仅仅是city属性。换句话说,您正在尝试更新该user条记录中的每个属性,包括几个只读的属性。

这是其中一种情况,其中包含一个包装REST API的SDK可能会导致一些令人困惑的错误。作为REST API,它是无状态的,因此传递整个user属性集会告诉您想要PATCH所有这些值的API。

您还将另一个user对象传入me对象(即,您将使用此其他用户的属性值替换所有属性值):

await graphClient.Me.Request().UpdateAsync(user);

相反,试试这个:

GraphServiceClient graphClient = SDKHelper.GetAuthenticatedClient ();

// hard coding user id for now
var userId = "9a5b83cd-85ff-4ad1-ab2f-b443941a518e";

await graphClient.Users[userId].Request ().UpdateAsync(new User
{
    City = "New York"
});