oauth-2.0 - 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 的令牌,但我自己的应用程序的角色/范围。
解决方案
您不能为自己请求令牌,您必须创建两个应用程序,一个作为客户端应用程序,另一个作为 api 应用程序。你要确保这两个应用程序是多租户应用程序,然后使用客户端应用程序调用api应用程序。 这里有详细的官方文档。
对于多租户应用,这里有更详细的答案供您参考。
更新:
经过我的测试,如果要使用单个应用程序,步骤与我提供的链接基本相同:
- 使用Powershell cmd
New-AzureADServicePrincipal -AppId "{client id of your application}"
将应用程序作为企业应用程序添加到您的客户租户。 - 将用户重定向到 Microsoft 身份平台管理员同意端点,使用客户租户的管理员帐户登录以完成管理员同意。
- 如链接中所述,您不能使用
api://{client id of app}/.default
for,scope
因为它会告诉您该应用程序在客户租户中不存在,您需要使用https://graph. microsoft.com/.default
.
推荐阅读
- amazon-web-services - AWS Lambda:从 S3 上传事件中读取图像
- python - 无法使用 QInputDialog 自动关闭第二个窗口
- python - + 不支持的操作数类型:'int' 和 'str' - 尝试对一行中的所有整数求和
- java - 如何正确解析java中的tcp数据包?
- fortran - 程序在读取文件时收到信号 SIGSEGV
- javascript - 单击具有 html 数据属性的元素时如何触发操作
- c# - C#如何从json文件动态地制作treeview
- python-3.x - 模块“numpy”没有属性“max”
- javascript - 如何将玉模板下拉列表中的选定值传递给节点js中的rest api?
- visual-studio-code - 如何增加最近工作空间的数量?