获取计划返回401-未经授权

时间:2019-12-12 04:11:50

标签: c# microsoft-graph microsoft-graph-sdks

我是Microsoft Graph的新手。我想创建一个控制台应用程序,该应用程序将基于组名称获取所有组ID,然后获取具有该组ID和计划名称的特定计划ID(我可能会或可能不是该组的成员)。

我已经编写了一个能够获取组ID的代码,但是当我尝试使用它来获取计划ID时:

var targetGroup = await _graphClient
    .Groups
    .Request()
    .Filter($"startsWith(displayName,'{groupName}')")
    .GetAsync();

var groupId = targetGroup.First().Id;

var plans = await _graphClient
    .Groups[groupId]
    .Planner
    .Plans
    .Request()
    .GetAsync();

这最后一行会引发异常:

  

401-未经授权:由于凭据无效,访问被拒绝。

我正在使用O365 E3试用版。我已经阅读了这里发布的所有解决方案并尝试了它们,但错误仍然存​​在。我已授予用户,任务,目录,文件和组的所有权限(已委派和应用程序)。

权限或跟踪版本可能有问题吗?

更新:

我也尝试过:

GraphHttpClient.MicrosoftGraphV1BaseUri + $"groups/{groupId}/planner/plans";

它对于groupId很好用,但是当我添加/planner/plans时会抛出相同的异常。

2 个答案:

答案 0 :(得分:1)

您使用的是用户访问令牌还是应用程序令牌?由于该API(GET / groups / {group-id} / planner / plans),根据documentation,Application Token不支持该API。 我不确定是否需要用户访问令牌,但我认为您必须是该小组的成员才能参与计划。

答案 1 :(得分:0)

您引用的示例代码正在使用“客户端证书OAuth”授权。这将导致将Application作用域分配给您的令牌,而不是Delegate作用域:

AuthenticationResult authResult = null;
authResult = await _clientApplication
    .AcquireTokenForClient(_scopes) // This is "Client Credentials"
    .ExecuteAsync();
return authResult.AccessToken;

具体来说,正在发生AcquireTokenForClient调用。来自documentation

  

使用客户端凭据流从应用程序中配置的权限中为机密客户端本身(无用户名)获取令牌。参见https://aka.ms/msal-net-client-credentials

正如马丁·琼斯(Martin Jones)在回答中所说的,/plans only supports Delegated permission scopes

  • 代理人(工作或学校帐户):Group.Read.AllGroup.ReadWrite.All
  • 委派的(个人Microsoft帐户):不支持
  • 应用程序:不受支持

要调用/plans,您将需要使用其他OAuth授权来获取令牌,该授权支持诸如AcquireTokenOnBehalfOfAcquireTokenByAuthorizationCode之类的委派权限。