【问题标题】:"The tenant for tenant guid ... does not exist" when using client credentials flow (daemon) to access Microsoft Graph API使用客户端凭据流(守护进程)访问 Microsoft Graph API 时出现“租户 guid 的租户 ... 不存在”
【发布时间】:2019-11-27 19:11:20
【问题描述】:

我想从控制台应用程序定期访问 Microsoft Graph,以便将邮件从 Outlook 邮箱复制到数据库。 为了以编程方式进行身份验证,我不得不使用 Microsoft Graph 的“客户端凭据流”。

这些是我必须采取的步骤:

  1. 在 Azure 门户中注册应用并为其创建客户端密码。
  2. 添加我需要的所有权限并授予他们访问权限:

  3. 让管理员通过首次访问来确认这些权限。这是使用以下 URL 完成的:

    https://login.microsoftonline.com/{tenant}/v2.0/adminconsent
    ?client_id={app id}
    &state=1234
    &redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
    &scope=https://graph.microsoft.com/.default
    

    我收到以下回复:

    admin_consent: True
    tenant: ca566779-1e7b-48e8-b52b-68**********
    state: 12345
    scope**: scope: https://graph.microsoft.com/User.Read https://graph.microsoft.com/.default
    

    (范围可能会解释这里稍后描述的问题:为什么我配置了 13 个不同的权限时只得到User.Read??)

  4. 获取访问令牌(成功!):

  5. 尝试读取用户(成功):

  6. 尝试阅读我自己的电子邮件(没有成功):

  7. 尝试阅读其他人的电子邮件(用户被邀请以访客身份访问应用程序,但仍然没有成功):

我不明白为什么我无法阅读消息,但我可以阅读用户。似乎权限被完全忽略了(我确认我不需要任何权限来读取用户)。

更新

这是我的租户名称:

这些是添加到租户的用户:

重要提示:我的 Azure AD 中没有 Office 365 订阅。所有这些电子邮件都属于不同的广告。

上一个问题 "The tenant for tenant guid does not exist" even though user is listed on users endpoint? 与我的类似,但我相信这不是重复的,因为我的问题略有不同,并且建议的解决方案使用 OAuth1(我使用的是 OAuth2)。

【问题讨论】:

    标签: microsoft-graph-api microsoft-graph-mail


    【解决方案1】:

    Microsoft Graph只能访问您已通过身份验证的租户内的数据。这意味着您无法访问来自其他租户的邮箱,即使该用户是您通过身份验证的租户中的来宾。允许这样做会违反 AAD/O365 租户中数据隔离的基本原则。

    还需要注意的是,AAD/O365 和 Outlook.com 是不同的平台。 Microsoft Graph 的核心价值支柱是跨 AAD 和 MSA 的通用 API 层,但在幕后,它们正在调用不同的后端。

    除了数据隔离和这些不同的平台之外,Outlook.com 根本不支持应用程序权限 (Client Credentials)。您只能使用委派权限访问 Outlook.com,甚至只能使用limited set of scopes are supported

    并非所有权限都对 Microsoft 帐户和工作或学校帐户都有效。您可以检查每个权限组的 Microsoft 帐户支持列,以确定特定权限是否对 Microsoft 帐户、工作或学校帐户有效,或两者都有效。

    关于包含哪些范围,我怀疑这里的问题是您在此租户中没有 O365 的许可证。如果它允许您在没有订阅的情况下同意,这可能(理论上)导致应用程序在/如果稍后添加订阅时意外地获得同意。话虽如此,如果没有看到您要返回的实际令牌的示例,就很难说清楚(请随意发布一个希望我进一步研究的人)。

    最后,juunas 对于/me 也是正确的。 /me 段是“当前经过身份验证的用户”的别名。由于您在使用客户端凭据时没有对用户进行身份验证,因此/me 实际上是null

    【讨论】:

    • 如果我理解正确,您告诉我 2 件事:1 - “您无法在 Azure AD 中阅读不属于 O365 订阅的电子邮件”和 2 - “outlook.com 帐户不” t 允许所有权限”。 1. 令人沮丧,因为这正是我所需要的(我认为邀请用户作为客人就足够了)。 2. 没有问题,因为根据docs.microsoft.com/en-us/graph/permissions-referenceMail.Read 操作对Outlook.com 帐户有效。在我授予您赏金之前,您能否确认我的理解正确,并且“通用”端点不是一种选择?
    • 如果您使用的是委托范围 (authorization_codegrant),那么您可以将 Mail.Read 用于 O365 和 Outlook.com。如果您使用的是应用程序范围,则只能连接到 O365(没有接收 Outlook.com 管理员同意的机制)。
    • 如果您需要能够读取来自外部 O365 和 Outlook.com 邮箱的邮件,那么您需要使用委派权限范围并让用户以交互方式进行身份验证。
    • 现在我完全明白了:如果用户以交互方式进行身份验证,我只能访问 Outlook/外部 O365。由于我需要使用后台进程而不显示登录弹出窗口,因此我只能访问内部 O365 中的电子邮件。谢谢,赏金已发! :)
    • 我实际上正在做类似的事情......with client_credentials flow。我有一个连接到 Outlook 和 Azure Active Directory 租户的个人 Microsoft 帐户。已注册我的申请。拥有付费 Office 365 许可证和免费试用 Azure AD 帐户(具有相同的 MS 帐户)。仍然会引发错误“OrganizationFromTenantGuidNotFound”、“消息”:“租户 guid '' 的租户不存在。”
    【解决方案2】:

    /me 不适用于客户端凭据令牌。 /me 指的是什么?没有用户参与,所以它没有任何意义。

    对于第二个问题,此用户在您的租户中是否有 Exchange Online 邮箱?

    【讨论】:

    • 感谢您的回答。我尝试访问的用户是我添加到租户的用户之一,但我不知道这是否回答了您的问题。我在问题的末尾添加了 2 个新的屏幕截图,其中包含更多详细信息。你看有什么不对吗?我无法访问 3 个用户的任何电子邮件...
    • 如果他们在您的 Azure AD 租户中没有 Office 365,则只有在您的应用使用 v2 的“通用”终结点时才能访问 Microsoft 帐户电子邮件。不是带有您租户 ID 的那个。您将获得一个位于您的 AAD 租户上下文中的令牌。因此,您正在尝试获取他们存储在您的租户中的电子邮件。
    • 我已经尝试过使用 'common' 而不是租户,但由于无法拨打任何电话(包括graph.microsoft.com/v1.0/users),我开始使用租户。您的建议让我再次对其进行测试,我发现在 adminconsent 步骤中存在问题(我之前没有注意到):>我一直在搜索网络,但我仍然不知道问题是什么。
    • 您的应用也需要设置为支持个人 Microsoft 帐户。可以选择只允许您的组织、任何组织或任何组织和个人帐户
    • 我认为我在身份验证选项卡中设置了该选项,我可以阅读以下内容:
    【解决方案3】:

    接受的答案是帮助我的答案。但是,我最终测试了加入测试所需的内容: Office 365 Developer Program (free)

    此程序将允许您创建一个包含多达 25 个电子邮件帐户的 Azure Active Directory。它还允许您创建 16 个带有电子邮件的虚构电子邮件帐户(通过单击一个按钮)。您可以免费使用此基础架构 90 天。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-25
      • 2020-12-18
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多