为什么在与图形 API 通信时Microsoft会"AccessDenied"?



我无法访问Microsoft图中的端点。

当我设置通信时,我将把文件上传到用户一个驱动器 但现在我只是想获取驱动器中的项目列表。

这是我从 https://graph.microsoft.com/v1.0/drives/{{drive_id}}/root/children得到的回应

{
"error": {
"code": "AccessDenied",
"message": "Either scp or roles claim need to be present in the token.",
"innerError": {
"request-id": "123",
"date": "2020-01-09T11:43:20"
}
}
}

我通过在终结点 https://graph.microsoft.com/v1.0/me/上使用图形资源管理器检索了drive_id 在登录用户上。

应该注意的是,我可以使用此端点 https://graph.microsoft.com/v1.0/subscriptions 因此,我必须对访问令牌做正确的事情。

我按照本教程使用客户端凭据流获取访问令牌。

这是我用来获取访问令牌的代码

httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www- 
form-urlencoded"));
var req = new HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/<tenant>/oauth2/token");
req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{"grant_type", "client_credentials"},
{"client_id", "123"},
{"client_secret", "123"},
{"resource", "https://graph.microsoft.com"}
});

当我解码 JWT 时,我在令牌中看不到任何范围,但如果我理解正确 标头应获取管理员允许的范围。

管理员已向我的应用授予了图形资源管理器的以下权限: (虽然我没有代理权限,但这重要吗?

Filse.Read,
Files.ReadWriteAll,
Sites.ReadWtiteAll,
User.Read

我正在邮递员中使用此集合进行测试。

提前感谢任何建议。

来自Marc LaFleurs的回答:

首先要了解的是,您不能在同一令牌中同时接收应用程序和委派权限,这是非此即彼的情况。您收到的类型完全取决于您用于请求令牌的 OAuth 授权:

授权代码和隐式返回 具有 scp 属性的委托令牌 客户端凭据返回具有角色属性的应用程序令牌 第二件事是,你已请求将范围限定为两个不同的 API。根据您选择的内容,您将无法通过Microsoft Graph访问SharePoint,因为您只请求访问旧版SharePoint API。更重要的是,你只请求了 Graph 的委派用户.读取范围,因此当你使用客户端凭据获取令牌时,该令牌将没有任何权限。

若要获取用于读取 SharePoint 网站的应用程序令牌,需要选择"网站.读取.全部"Microsoft"图形应用程序"权限。

最新更新