首页 > 解决方案 > Azure 多租户应用程序 - 请求管理员同意自己应用程序的角色

问题描述

我制作了一个多租户应用程序(客户端 ID:“abc-efg”),它需要我的客户租户图表的一些资源。为了获得他们图表的权限,我创建了一个我的客户的 Azure 管理员单击并同意的 URL:

https://login.microsoftonline.com/organizations/v2.0/adminConsent?client_id=abc-efg&scope=https://graph.microsoft.com/.default

如果我将应用程序权限(即 Groups.Read)添加到客户端 ID 为“abc-efg”的应用程序,客户将获得一个同意屏幕并可以将应用程序添加到他的租户。
这很好用!

我现在有另一个应用程序公开了一些自己的权限(即:Custom.Read.All)。该应用程序公开了这些权限,同时也拥有这些权限。这是需要的,因为该应用程序是受自定义权限保护的 api 的唯一消费者。

我的应用程序现在需要客户的这些自定义权限,所以我尝试使用与图表相同的方式:

https://login.microsoftonline.com/organizations/v2.0/adminConsent?client_id=vwx-xyz&scope=api://vwx-xyz/.default

但这会引发错误消息:

应用程序正在为自己请求令牌。仅当使用基于 GUID 的应用标识符指定资源时才支持此方案。

所以我只用 GUID 试试:

https://login.microsoftonline.com/organizations/v2.0/adminConsent?client_id=vwx-xyz&scope=vwx-xyz

但是找不到这个应用程序,因为该资源不存在。

如果我用谷歌搜索这条错误消息,我只能找到旧 V1 端点的评论,而不是 V2 的评论。

有人对此有解释吗?对于我自己的应用程序定义的权限,我如何为我的客户租户获取应用程序权限?

最后,我希望能够接收具有我客户的发行者租户 ID 的令牌,但我自己的应用程序的角色/范围。

标签: oauth-2.0azure-active-directorymicrosoft-identity-platform

解决方案


您不能为自己请求令牌,您必须创建两个应用程序,一个作为客户端应用程序,另一个作为 api 应用程序。你要确保这两个应用程序是多租户应用程序,然后使用客户端应用程序调用api应用程序。 这里有详细的官方文档。

对于多租户应用,这里有更详细的答案供您参考。

更新:

经过我的测试,如果要使用单个应用程序,步骤与我提供的链接基本相同:

  1. 使用Powershell cmd New-AzureADServicePrincipal -AppId "{client id of your application}"将应用程序作为企业应用程序添加到您的客户租户。
  2. 将用户重定向到 Microsoft 身份平台管理员同意端点,使用客户租户的管理员帐户登录以完成管理员同意。
  3. 如链接中所述,您不能使用api://{client id of app}/.defaultfor,scope因为它会告诉您该应用程序在客户租户中不存在,您需要使用https://graph. microsoft.com/.default.

推荐阅读