You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更新应用注册的配置权限且不覆盖现有权限?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:10:02