Microsoft graph api 无法访问onedrive内容

Microsoft graph api 无法访问onedrive内容,microsoft-graph-api,onedrive,Microsoft Graph Api,Onedrive,我正在开发一个应用程序,需要使用Microsoft Graph访问OneDrive for Business上的文件。我在Azure上创建了一个web应用程序,我成功地获得了身份验证令牌,并且我能够使用https://graph.microsoft.com/v1.0/me。但是,如果我尝试使用https://graph.microsoft.com/v1.0/me/drive/root/children我收到一个拒绝访问错误 我已经在Graph Explorer上进行了检查,我能够毫无问题地获得查

我正在开发一个应用程序,需要使用Microsoft Graph访问OneDrive for Business上的文件。我在Azure上创建了一个web应用程序,我成功地获得了身份验证令牌,并且我能够使用
https://graph.microsoft.com/v1.0/me
。但是,如果我尝试使用
https://graph.microsoft.com/v1.0/me/drive/root/children
我收到一个拒绝访问错误

我已经在Graph Explorer上进行了检查,我能够毫无问题地获得查询结果。对于我的web应用,我使用以下图形权限:

  • 人。读-授权
  • Sites.ReadWrite.All-委派
  • Sites.ReadWrite.All-应用程序
  • Tasks.ReadWrite-委派
  • User.Export.All-委派
  • User.Export.All-应用程序
  • User.Invite.All-委派
  • User.Invite.All-应用程序
  • User.Read-委派
  • User.Read.All-委派
  • User.Read.All-应用程序
  • User.ReadBasic.All-委派
  • User.ReadWrite-委派
  • User.ReadWrite.All-委派
  • User.ReadWrite.All-应用程序
  • 脱机访问-委派
  • openid-委托
公共异步任务GetTokenAsync() { httpresponsemessageresp; 使用(var httpClient=new httpClient()) { httpClient.DefaultRequestHeaders.Accept .Add(新的MediaTypeWithQualityHeaderValue(“application/x-www-form-urlencoded”); var req=新的HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/{tenant}/oauth2/token/”; req.Content=newformurlencodedcontent(新字典 {{“授权类型”,“密码”}, {“client_id”,clientId}, {“客户机密”,clientSecret}, {“资源”https://graph.microsoft.com" }, {“用户名”,用户名}, {“密码”,密码}, {“scope”,“https%3A%2F%2Fgraph.microsoft.com%2F.default”} }); resp=等待httpClient.SendAsync(req); string content=wait resp.content.ReadAsStringAsync(); var jsonObj=新的JavaScriptSerializer()。反序列化(内容); 字符串令牌=jsonObj[“访问令牌”]; 控制台写入线(令牌); 返回令牌; } } 公共异步任务SendGraphRequest(字符串请求URL) { 使用(HttpClient HttpClient=new HttpClient()) { //设置HTTP GET请求 HttpRequestMessage请求= 新的HttpRequestMessage(HttpMethod.Get,requestUrl); apiRequest.Headers.UserAgent 添加(新产品InfoHeaderValue(“OAuthStarter”,“2.0”); aprequest.Headers.Authorization= 新的AuthenticationHeaderValue(“承载者”,等待GetTokenAsync()); //发送请求并返回响应 HttpResponseMessage response=等待httpClient.SendAsync(APIRESQUEST); var s=response.Content.ReadAsStringAsync(); 控制台写入线(s.Result); 返回结果; } } 我对graph api的调用是:

SendGraphRequest(“https://graph.microsoft.com/v1.0/me/drive)等等;
我从中得到的结果是:

{
  "error": {
    "code": "accessDenied",
    "message": "There has been an error authenticating the request.",
    "innerError": {
      "request-id": "request-id",
      "date": "2019-09-24T11:03:29"
    }
  }
}

您在这里设置的作用域太多了。例如,您不需要读和写作用域。您还请求了一些应用程序作用域,但使用了OAuth密码授权,该授权只适用于委托的作用域(不能将两者混合使用)

我建议将您的作用域与以下委派权限配对:

openid
User.ReadWrite
User.ReadBasic.All
文件.ReadWrite.All

People.阅读
Sites.ReadWrite.All
Tasks.ReadWrite
离线访问


请注意,
Sites.ReadWrite.All
Files.ReadWrite.All
稍有不同。一个涉及SharePoint,另一个涉及OneDrive

在尝试修复此问题将近两周后,我意识到问题不在于代码,而在于azure配置。我的假设是,如果在active directory管理员的帐户上安装web应用程序,则该active directory上的所有用户都可以使用相同的web应用程序访问各自的单驱动器帐户。不幸的是,情况并非如此,如果用户(不是管理员)试图使用web应用程序访问一个驱动器,他或她唯一能够访问的就是他们的帐户信息,而无法访问文件。为了使用graph api访问文件,web应用程序需要安装在各自的活动目录中。

我按照您的建议执行了操作,只保留了您提供的列表中的范围。我总是得到同样的结果。对于
https://graph.microsoft.com/v1.0/me
我设法获取用户数据,但只要我尝试类似
https://graph.microsoft.com/v1.0/me/drive/root/children
我收到拒绝访问错误。您能在浏览器中打开OneDrive的UI吗?如果您可以将实际的
access\u令牌添加到您的问题中,这可能会有所帮助。是的,我可以在浏览器中打开OneDrive的UI。我得到的令牌是:(使用此网站,因为令牌太大)该令牌看起来正确。您是否尝试过使用SDK而不是手工编写调用?您好@sion005,对不起,差不多一年后。我不是管理员,我一直被拒绝访问。你是说我必须安装Azure广告应用程序?