【问题标题】:Cannot access OneDrive storage for inter tenant无法访问租户间的 OneDrive 存储
【发布时间】:2020-10-14 12:34:44
【问题描述】:

我尝试创建一个应用程序,另一家公司/租户中的用户可以使用该应用程序访问他/她的 OneDrive 存储。但是失败了。非常感谢有人能告诉我我犯了什么错误或哪些步骤。

(我搜索了帖子,似乎与此处报告的问题不同。)

详情如下: 租户 X 中的用户 (user01@company.com) 希望使用服务/系统(由租户 Y 开发)访问他/她 One Drive 存储中的文件。

1.)租户 Y 已经获得 Azure 服务并订阅了 Office 365 服务(因为 One Drive API 需要 SPO 许可证)。

2.) 在租户 Y 中使用 AAD,我将用户的电子邮件 (use01@company.com) 添加到活动目录 (AAD) 中作为来宾用户,并且用户已收到通知电子邮件并接受它。

3.)在租户 Y 中使用 AAD,我注册了一个新应用程序,从 支持的帐户类型中选择了任何组织目录中的帐户选项> 部分,设置重定向 URI。

4.) 为 Graph API(如 Files.ReadWriteFiles.ReadWriteAll)添加了委派的 API 权限,并获得批准新添加的权限请求。

5.) 为应用程序创建了一个新的客户端密码。

6.) 有了应用程序的租户 ID、客户端 ID 和客户端密码,现在我可以为用户 (user01@company.com) 启动 OAuth2 身份验证流程。最后,我得到了这个用户的访问令牌

7.) 有了访问令牌,就可以获取用户的个人资料https://graph.microsoft.com/v1.0/me

8.) 对于此请求,它会抱怨 401 Unauthorized 错误:https://graph.microsoft.com/v1.0/me/drive。 (顺便说一下,这样的请求对于同一个租户Y的用户来说是没有问题的)

回复如下:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: application/json
request-id: ffef8bc9-11e7-4d07-9df3-e3cee81ef7b2
client-request-id: ffef8bc9-11e7-4d07-9df3-e3cee81ef7b2
x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"East Asia","Slice":"SliceC","Ring":"4","ScaleUnit":"002","RoleInstance":"AGSFE_IN_19"}}
Strict-Transport-Security: max-age=31536000
Date: Wed, 24 Jun 2020 07:13:00 GMT
Content-Length: 249
 
{
  "error": {
    "code": "accessDenied",
    "message": "There has been an error authenticating the request.",
    "innerError": {
      "date": "2020-06-24T07:13:01",
      "request-id": "ffef8bc9-11e7-4d07-9df3-e3cee81ef7b2"
    }
  }
}
  • 已编辑:07/02 ---------------------------------------

附加请求以获取访问令牌:

1.) 使用此 GET 请求获取授权码: https://login.microsoftonline.com/{tenant-id-of-TenantY}/oauth2/v2.0/authorize?client_id={client-id}&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%2Fpersonal%2Ftoken&response_mode=query&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2F.default&prompt=consent&state=13570

2.) User01@company.com 登录并批准授权请求,本地http服务器将获取授权码。

3.) 发送 POST 请求到:https://login.microsoftonline.com/{tenant-id-of-TenantY}/oauth2/v2.0/token,请求参数在正文中获取访问令牌,如链接中的图像。 screenshot of the POST request

4.) 使用结果访问令牌发送目标 Graph API 请求。结果就是这张图。Result of the /me/drive API

【问题讨论】:

    标签: azure azure-active-directory microsoft-graph-api


    【解决方案1】:

    无需在租户 Y 中将 use01@company.com 添加为来宾用户。只需确保它在租户 X 中具有 SPO 许可证即可。

    在为用户调用 Microsoft Graph API 之前,请构建 URL 以授予租户范围的管理员同意。请参阅参考资料here

    https://login.microsoftonline.com/{tenant-id of Tenant X}/adminconsent?client_id={client-id of the Azure AD app in Tenant Y}
    

    在租户 X 中以管理员身份登录,为 租户 X 进行管理员同意。之后,您可以为租户 X 中的用户访问 OneDrive 存储。

    请注意,您应该调用 Tenant X/authorize/token 端点。

    https://login.microsoftonline.com/{tenant-id-of-TenantX}/oauth2/v2.0/authorize?client_id={client-id}&......
    

    POST https://login.microsoftonline.com/{tenant-id-of-TenantX}/oauth2/v2.0/token
    

    【讨论】:

    • 嗨,艾伦,非常感谢 cmets。但是,我已根据您的建议进行了验证并重试,但发生了同样的错误。 :-( 我已经确认 user01@company.com 在租户 X 中具有 SPO 许可证(他已经拥有 OneDrive 和在其中创建的一些文件),并且已经为租户 X 完成了管理员同意(实际上,user01@company .com 是管理员)。不知道我仍然错过了什么。
    • @Crab 请在jwt.io 中解码您的访问令牌以查看包含哪些范围。
    • 嗨,艾伦,感谢您的提示。我认为它应该在解码访问令牌后在范围内包含所需的权限,包括范围的部分如下:... "puid": "10032000C96A8908", "scp": "AllSites.Manage AllSites.Read AllSites.Write Files.ReadWrite Files.ReadWrite.All MyFiles.Read MyFiles.Write openid profile User.Read User.ReadBasic.All email", "signin_state": [ "kmsi" ], ....
    • @Crab 你能分享获取访问令牌的完整请求吗?
    • 嗨艾伦,为了您的信息,我编辑了帖子以添加获取访问令牌的请求。 (直接在cmets中输入会太长。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多