C# Microsoft Graph API更新另一个用户';谁的照片?

C# Microsoft Graph API更新另一个用户';谁的照片?,c#,azure,office365,azure-active-directory,microsoft-graph-api,C#,Azure,Office365,Azure Active Directory,Microsoft Graph Api,使用Microsoft Graph API,我能够获得Azure Active Directory租户中所有用户的列表,并确定他们是否有配置文件图片。然后我想获取没有照片的用户列表并为他们上传一张,但是API返回403错误,即使我使用的帐户具有对所有用户帐户的完全访问权限,并且应用程序的设置具有对Graph API的完全权限 using (HttpClient client = new HttpClient()) { client.BaseAddress = new Uri("https

使用Microsoft Graph API,我能够获得Azure Active Directory租户中所有用户的列表,并确定他们是否有配置文件图片。然后我想获取没有照片的用户列表并为他们上传一张,但是API返回403错误,即使我使用的帐户具有对所有用户帐户的完全访问权限,并且应用程序的设置具有对Graph API的完全权限

using (HttpClient client = new HttpClient())
{
    client.BaseAddress = new Uri("https://graph.microsoft.com/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/jpeg"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", oauthToken);

    // HTTP GET                
    HttpResponseMessage response = await client.PatchAsync($"v1.0/users/{emailAddress}/photo/$value", byteContent);
    if (!response.IsSuccessStatusCode)
    {
        throw new Exception("Error!");
    }
}
403禁止

是否无法使用Graph API执行此操作,或者我是否在某个地方丢失了权限

SCP值为:
日历。读日历。读写联系人。读联系人。读写目录。访问服务器。所有目录。读。所有目录。读写。所有电子邮件交换。管理文件。读文件。读文件。读文件。选定文件。读写文件。读写。AppFolder文件。读写。选定完全访问权限。\u作为用户组。读。所有组。读写。所有邮件。读邮件。读写邮件。发送MailboxSettings.ReadWrite Notes.Create Notes.Read Notes.Read Notes.ReadWrite.All Notes.ReadWrite.CreatedByApp脱机访问openid人物。Read人物。ReadWrite配置文件站点。Read。所有任务。Read任务。ReadWrite用户。Read用户。Read用户。所有用户。ReadWrite用户。ReadWrite。All

首先,您应该看看新的Microsoft Graph SDK,它是在//Build 2016期间发布的 以下是Microsoft Graph SDK的Github:
下面是我使用它创建的完整示例:

对于你的问题,我写了两种方法,它们对我很有效: 我假设您有一个方法来获取有效的访问令牌

using (HttpClient client = new HttpClient())
{
    var authResult = await AuthenticationHelper.Current.GetAccessTokenAsync();
    if (authResult.Status != AuthenticationStatus.Success)
        return;

    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + authResult.AccessToken);

    Uri userPhotoEndpoint = new Uri(AuthenticationHelper.GraphEndpointId + "users/" + userIdentifier + "/Photo/$value");
    StreamContent content = new StreamContent(image);
    content.Headers.Add("Content-Type", "application/octet-stream");

    using (HttpResponseMessage response = await client.PutAsync(userPhotoEndpoint, content))
    {
        response.EnsureSuccessStatusCode();
    }
}
如果您使用Microsoft Graph SDK,它将非常简单:)

Seb对于更新其他用户的照片非常清楚

要更新组织中任何用户的照片,您的应用程序必须具有user.ReadWrite.All应用程序权限,并以自己的身份(而不是代表用户)调用此API。要了解更多信息,请参阅无需登录用户即可访问

这意味着您将需要应用程序的访问令牌,而不是用户访问您的应用程序时获得的令牌。这显示了如何获取应用程序访问令牌。这也意味着您必须授予应用程序应用程序权限,这通常会被遗忘

一旦您获得了令牌,您就可以对其进行检查,以查看令牌中的声明


您正在谈论令牌中的
scp
声明。只有当您拥有用户令牌而不是应用程序令牌时,才会出现此问题。

请在中输入您的令牌,并为“scp”字段提供值。这是您的令牌中的权限列表。谢谢。嗨,文卡特,我在原始帖子中添加了SCP属性值,因为它太长了,无法作为评论输入。我不确定该操作是否适用于修补程序。这应该是一个推杆。但是,我也重新编写了相同的问题(作为管理员用户运行),下面是跟踪。作用域包含user.readwrite.all,这些内容应足以更新其他用户的照片。{“error”:{“code”:“ErrorAccessDenied”,“message”:“访问被拒绝。请检查凭据并重试。”,“innerror”:{“请求id”:“23559b24-d5e9-4dae-8311-94f706320b4b”,“date”:“2016-04-09T06:21:56”}}}如何获取令牌?来自clientid+clientsecret?嗨,Dan,我使用的是PATCH,因为图中提到了使用PATCH方法,但我也尝试了使用PUT,结果也不起作用。我开始认为API不允许更新其他用户的照片。感谢您让我了解SDK,但我仍然收到相同的错误消息。我认为API不允许更新其他用户的照片,即使我正在使用的帐户应该可以访问它。因此,当我重新编写这是在使用客户端库时,您的作用域或OAUTH2访问令牌存在问题;)该用户也是管理员。我不相信你能通过app+用户代码流做到这一点,而且你需要一个只使用app的令牌来做到这一点。您是否尝试过客户端凭据流?这对你有用吗?文档现在已经很清楚了,但不是在我3年前提交问题时。很抱歉,没有在帖子中看到日期
GraphServiceClient graphService = new GraphServiceClient(AuthenticationHelper.Current);
var photoStream = await graphService.Users[userIdentifier].Photo.Content.Request().PutAsync(image); //users/{1}/photo/$value