如何更新应用注册的配置权限且不覆盖现有权限?
解决Azure AD应用注册权限更新的Graph API覆盖与大小限制问题
一、为什么PATCH请求会覆盖原有权限?
当使用Graph API的PATCH方法更新requiredResourceAccess属性时,数组类型的属性默认会被完整替换,而非追加元素。你当前的请求仅传入新权限数组,原有配置会被直接覆盖,导致旧权限被移至"其他已授予权限"中。
二、实现不覆盖的增量更新步骤
要保留原有权限并添加新权限,必须先获取现有配置,合并新权限后再提交:
1. 获取目标应用的现有权限配置
发送GET请求提取当前requiredResourceAccess配置:
curl --silent -X GET -H "Authorization: Bearer ${TOKEN}" \ https://graph.microsoft.com/v1.0/applications/<TARGET_APP_OBJECT_ID> | jq '.requiredResourceAccess'
(注:可使用jq工具快速提取字段,也可手动解析JSON响应)
2. 合并新权限到现有数组
按以下逻辑处理合并:
- 检查新权限对应的
resourceAppId是否已存在于现有数组中:- 若存在:将新的
resourceAccess项追加到该resourceAppId对应的resourceAccess数组(需确保权限ID不重复) - 若不存在:直接将新的权限对象添加到
requiredResourceAccess数组末尾
- 若存在:将新的
示例合并后的payload结构:
{ "requiredResourceAccess": [ { "resourceAppId": "<EXISTING_SOURCE_APP_1_ID>", "resourceAccess": [{"id": "<EXISTING_SCOPE_1_ID>", "type": "Scope"}] }, { "resourceAppId": "<EXISTING_SOURCE_APP_2_ID>", "resourceAccess": [{"id": "<EXISTING_SCOPE_2_ID>", "type": "Scope"}] }, { "resourceAppId": "<NEW_SOURCE_APP_ID>", "resourceAccess": [{"id": "<SCOPE_ID_USER_IMPERSONATION>", "type": "Scope"}] } ] }
3. 发送PATCH请求
使用合并后的完整数组作为payload发送请求,即可保留原有权限并添加新权限:
curl --silent -X PATCH -H "Authorization: Bearer ${TOKEN}" -H "Content-Type:application/json" \ -d '{"requiredResourceAccess": [/* 合并后的完整数组 */]}' \ https://graph.microsoft.com/v1.0/applications/<TARGET_APP_OBJECT_ID>
三、解决payload大小超过限制的403错误
当requiredResourceAccess数组元素过多时,会触发Directory_ResourceSizeExceeded限制,可通过以下方式处理:
- 分批次增量更新:每次仅添加5-10项新权限,每次更新前重新获取最新配置,合并一批新权限后提交,循环直至所有权限添加完成。
- 清理冗余权限:先检查现有权限中是否存在不再使用的项,通过PATCH请求删除冗余项,减小数组整体大小后再添加新权限。
- 避免重复提交:合并权限时严格校验权限ID是否已存在,防止重复添加导致数组不必要的膨胀。
内容的提问来源于stack exchange,提问作者phanxen
相关产品推荐
相关产品推荐

