【问题标题】:Microsoft Graph API - Insufficient privileges to complete the operationMicrosoft Graph API - 权限不足,无法完成操作
【发布时间】:2017-08-30 00:47:28
【问题描述】:

我正在尝试使用 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
  • 邮件.发送
  • User.Read
  • User.Read.All
  • User.ReadWrite.All

我是否需要其他权限才能做到这一点?

最后,我想创建一个控制台应用程序(不是 Web 应用程序),我可以更新目录中的其他用户信息。但我认为使用 Microsoft 提供的这个示例应用程序是一个好的开始。

【问题讨论】:

    标签: microsoft-graph-api


    【解决方案1】:

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

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

    您还将不同的 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"
    });
    

    【讨论】: