azure - 如何在自定义应用同意策略中指定权限?
问题描述
New-AzureADMSPermissionGrantConditionSet
我已使用并遵循MS docs成功制定了自定义应用同意政策。我指定ClientApplicationIds
了,效果很好。
现在我还想指定必须匹配的权限。在权限上,文档说:
我需要帮助理解(和访问)“API 的 ServicePrincipal 对象的 OAuth2Permissions 属性”中的权限 ID。
文档指的是什么 ServicePrincipal?应用程序的家庭租户中的一个,还是使用该应用程序的租户中的一个?如果尚未同意该应用程序,则使用该应用程序的租户中没有 ServicePrinciple,因此我遇到了先有鸡还是先有蛋的问题。
我期望获得的权限是什么?我想知道为什么 MS 不只是让我们将范围作为字符串传递,例如email
,mail.read
等等。我不明白在这个特定的上下文中权限是什么。
解决方案
我需要帮助理解(和访问)“API 的 ServicePrincipal 对象的 OAuth2Permissions 属性”中的权限 ID。
权限 ID 是指您在客户端应用注册中添加id
的 API(即在 API 中定义)的 Delegated 权限。oauth2Permissions
例如,您在租户 A 中创建了一个多租户客户端应用程序,您添加了Microsoft Graph的Mail.Read
Delegated 权限,默认情况下,还会自动有一个Delegated 权限,因此您的客户端应用程序中总共有两个权限。User.Read
API permissions
现在,您想在租户 B 中使用自定义应用同意策略,您希望用户同意这两个权限,那么-Permissions
应该是id
Microsoft Graph 中定义的两个权限中的一个,要轻松找到它,只需导航到客户端应用在租户 A ->Manifest
中,您可以获得id
如下所示的 s。
完整的命令应该是
New-AzureADMSPermissionGrantConditionSet `
-PolicyId "joy-custom-policy" `
-ConditionSetType "includes" `
-PermissionType "delegated" `
-ResourceApplication "00000003-0000-0000-c000-000000000000" `
-Permissions @("e1fe6dd8-ba31-4d61-89e7-88639da4683d","570282fd-fa5c-430d-a7fd-fc8dc98a9dca")
在另一种情况下,您在客户端应用程序中使用自定义 API(在租户 A 中创建)而不是 Microsoft API。
如果是这样,你需要先在租户B中为API App授予管理员同意,否则会报错The app needs access to a service (\"api://tenantA/myapi\") that your organization (tenant B) has not subscribed to or enabled
,或者你可以使用管理员帐户New-AzureADServicePrincipal -AppId <appid of the API app>
在租户B中运行,它也可以工作,同意后,普通用户将能够同意您在策略中定义的权限。
注意:有时,您可能会收到如下错误This app may be risky
。
这意味着 Microsoft 检测到有风险的最终用户同意请求,该请求将需要升级到管理员同意,如果您仍然希望用户同意该权限,您需要先禁用基于风险的升级同意,然后用户将能够同意该权限。
推荐阅读
- amazon-kinesis - 尝试放置记录时出现运动异常
- r - 如何基于列创建成对表以在r中的元素之间进行划分
- exception - redis.clients.jedis.exceptions.JedisDataException:ERR错误编译脚本(新功能):user_script:1:附近的格式错误
- microservices - 如何处理 API 网关中的故障
- firebase - 我们可以在动态 Firebase 托管运行时在新创建的分支中添加 ci cd 吗?
- python - 无法使用 pip 运行 jupyter notebook
- google-sheets - 尝试使用数据验证下拉列表过滤查询 - 数字选项有效,但不是数字/字母的组合
- python - 我如何访问类对象的值
- javascript - 如何将 Fusionchart 中的 donut2d 更改为半甜甜圈?
- javascript - 用 recorder.js 录制语音并将其上传到 python-flask 服务器,但 WAV 文件已损坏