我是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
时会抛出相同的异常。
答案 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.All
,Group.ReadWrite.All
要调用/plans
,您将需要使用其他OAuth授权来获取令牌,该授权支持诸如AcquireTokenOnBehalfOf
或AcquireTokenByAuthorizationCode
之类的委派权限。