【问题标题】:Azure mulit-tenant application not getting tokens with newly defined scopesAzure 多租户应用程序未获取具有新定义范围的令牌
【发布时间】:2018-07-05 05:20:42
【问题描述】:

我正在开发一个 Azure 多租户应用程序,它使用来自 Microsoft Graph API 和 Windows Azure Active Directory 资源的范围。我们正在使用 v1 OpenID 身份验证代码流。

最近我们向 Microsoft Graph API 添加了更多请求的范围,我们提示用户在我们的 /common/oauth2/token 交换中使用 prompt=admin_consentresource=https://graph.microsoft.com 重新验证。

当提示用户再次接受范围时,您可以看到新请求的范围并且调用似乎成功完成,我们收到一个新的access_token

但是,响应中返回的范围和针对范围的嵌入式 JWT 声明仅列出了所请求范围的一小部分,而且它们似乎也仅来自其中一个资源(Windows Azure Active Directory)。

我们收到了新范围的 403,所以我认为这不是没有正确填充这些范围字段的问题。

有人知道为什么身份验证流程不会返回具有新请求范围的令牌吗?

这里列出了我要求的范围:

Windows Azure 活动目录

  • 读写目录数据(应用)
  • 以登录用户身份访问目录(委托)
  • 读写目录数据(委托)
  • 登录并阅读用户个人资料(委托)

微软图形

  • 在所有邮箱中读取和写入日历(应用程序)(新)
  • 读取和写入所有用户的完整个人资料(应用程序)
  • 读写目录数据(应用)
  • 以任何用户身份发送邮件(应用程序)(新)

谢谢!

【问题讨论】:

  • 当您请求 ID 令牌时,您是在请求特定资源还是将其留空?在对普通用户进行测试之前,您是否让管理员通过了管理员同意流程?
  • 我们没有在/common/oauth2/authorize 上指定资源,但我们在/common/oauth2/token 调用上发送resource=https://graph.microsoft.com(如果没有指定,我们会从端点获得400)。是的,我们有用户在下次登录时使用 prompt=admin_consent 重新认证。
  • prompt=admin_consent 强制执行管理员同意流程,prompt=consent 用于强制用户同意。它们是不同的东西。你试过prompt=consent吗?
  • 如果我请求应用程序范围,以便离线使用它们,我希望管理员正确地接受这些范围?
  • 我尝试使用prompt=consent 而不是prompt=admin_consent。原来的问题没有区别。新的作用域仍然没有出现在响应正文和 JWT 令牌中。

标签: azure oauth-2.0 azure-active-directory microsoft-graph-api azure-ad-graph-api


【解决方案1】:

当您通过指定特定资源向 AAD v1 发出令牌请求时,返回的访问令牌将仅包含访问该特定资源所需的范围。该协议的详细信息和示例记录在here

因此,如果您需要访问两个资源,则需要为每个资源请求访问令牌,并且相应的令牌将包含特定于该资源的范围。

在这种情况下,如果 AAD Graph 范围在 MS Graph 中可用,您可以将它们合并到 MS Graph 下并为 MS Graph 请求单个令牌。在身份验证流程中,您可以通过在身份验证请求的scope 字段中指定这些范围来控制要请求同意的范围,如参数here 的描述中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2021-06-04
    • 2014-02-10
    • 2015-08-17
    相关资源
    最近更新 更多