我制作了一个多租户应用程序(客户端ID:“ abc-efg”),该应用程序需要一些客户租户图的资源。为了获得对其图的许可,我创建了一个URL,我的客户的Azure管理员单击该URL并同意:
https://login.microsoftonline.com/organizations/v2.0/adminConsent?client_id=abc-efg&scope=https://graph.microsoft.com/.default
如果我向客户端ID为“ abc-efg”的应用程序添加了应用程序权限(即Groups.Read),则客户将获得一个同意屏幕,并将该应用程序添加到其租户中。
这很棒!
我现在有另一个应用程序,它公开了一些自己的权限(即:Custom.Read.All)。应用程序公开这些权限,同时拥有权限。之所以需要这样做,是因为该应用是受自定义权限保护的api的唯一使用者。
我的应用现在需要客户的自定义权限,所以我尝试使用与图表相同的方式:
https://login.microsoftonline.com/organizations/v2.0/adminConsent?client_id=vwx-xyz&scope=api://vwx-xyz/.default
但这会引发错误消息:
应用程序正在为其自身请求令牌。这种情况是 仅当使用基于GUID的App指定资源时才受支持 标识符。
所以我只能在GUID上尝试:
https://login.microsoftonline.com/organizations/v2.0/adminConsent?client_id=vwx-xyz&scope=vwx-xyz
但是找不到此应用,因为该资源不存在。
如果我搜索此错误消息,则只能找到旧V1端点的注释,而不是V2。
有人对此有解释吗?如何为我的客户租户获得我自己的应用程序定义的权限的应用程序权限?
最后,我希望能够接收具有我的客户的发行人租户ID但我自己的应用程序的角色/作用域的令牌。
答案 0 :(得分:0)
您不能自己请求令牌,必须创建两个应用程序,一个作为客户端应用程序,另一个作为api应用程序。您必须确保这两个应用程序是多租户应用程序,然后使用客户端应用程序调用api应用程序。 here详细的正式文件。
对于多租户应用程序,here是更详细的答案,供您参考。
更新:
经过测试后,如果要使用单个应用程序,则步骤基本上与我提供的链接相同:
New-AzureADServicePrincipal -AppId "{client id of your application}"
将应用程序作为企业应用程序添加到您的客户租户。api://{client id of app}/.default
用于scope
,因为它会告诉您该应用程序在客户租户中不存在,您需要使用https://graph. microsoft.com/.default
。