调用Invoke-GraphRequest遇403错误:仅支持用户令牌
解决应用程序上下文调用Graph API审批PIM请求的403权限问题
问题背景
你在交互式用户上下文(通过Connect-MgGraph -Scopes指定委托权限)中能正常运行PIM审批代码,但切换到应用程序上下文执行时,调用Invoke-GraphRequest的PATCH请求触发403 Forbidden错误,错误提示为:
{"error":{"code":"","message":"Only user tokens are supported","innerError":{"date":"2025-07-07T23:33:50","request-id":"xxx","client-request-id":"xxx"}}}
核心原因
触发错误的Graph API端点(/beta/roleManagement/directory/roleAssignmentApprovals/{approvalId}/steps/{stepId})不支持应用程序权限,仅允许使用用户令牌(代表具体用户的身份)调用,这是API本身的设计限制,无法通过添加应用程序权限绕过。
解决方案
1. 使用用户分配的托管标识(推荐)
创建一个用户分配的托管标识,将其作为拥有审批权限的用户身份使用:
- 在Azure门户中创建用户分配的托管标识,将该标识添加为对应PIM角色审批组的成员,或直接配置为角色的审批者。
- 在应用程序上下文中,通过该托管标识登录Graph:
Connect-MgGraph -Identity -ClientId "<用户分配的托管标识ClientID>" - 确保该托管标识已被授予所需的委托权限(与交互式上下文一致:
PrivilegedAccess.Read.AzureAD、RoleAssignmentSchedule.ReadWrite.Directory、PrivilegedAccess.ReadWrite.AzureAD、User.Read.All),注意是委托权限而非应用程序权限。
2. 采用OAuth2.0模拟(On-Behalf-Of)流程
让应用程序代表拥有审批权限的用户调用API:
- 为应用程序添加
DelegatedPermissionGrant.ReadWrite.All应用程序权限,用于获取用户的委托权限授权。 - 获取代表目标用户的访问令牌,再用该令牌调用审批API,示例代码:
# 获取应用程序自身的访问令牌 $appTokenParams = @{ ClientId = "<你的应用ClientID>" TenantId = "<租户ID>" ClientSecret = "<应用密钥>" Scopes = "https://graph.microsoft.com/.default" } $appToken = Get-MgAccessToken @appTokenParams # 获取模拟用户的访问令牌 $oboTokenParams = @{ Uri = "https://login.microsoftonline.com/<租户ID>/oauth2/v2.0/token" Method = "Post" Body = @{ grant_type = "urn:ietf:params:oauth:grant-type:jwt-bearer" client_id = "<你的应用ClientID>" client_secret = "<应用密钥>" assertion = $appToken.Token scope = "PrivilegedAccess.Read.AzureAD RoleAssignmentSchedule.ReadWrite.Directory PrivilegedAccess.ReadWrite.AzureAD User.Read.All" requested_token_use = "on_behalf_of" subject_token_type = "urn:ietf:params:oauth:token-type:jwt" } } $oboToken = Invoke-RestMethod @oboTokenParams # 使用模拟令牌执行审批操作 Invoke-GraphRequest -Method PATCH ` -Uri "https://graph.microsoft.com/beta/roleManagement/directory/roleAssignmentApprovals/$approvalId/steps/$stepId" ` -Body $body ` -AccessToken $oboToken.access_token - 注意:被模拟的用户必须本身拥有PIM请求的审批权限,且应用程序已被授权代表该用户调用指定API。
3. 迁移到Power Automate/Logic Apps
如果自动化场景允许,将审批逻辑迁移到Power Automate:
- 创建流时选择以指定用户身份运行(选择拥有审批权限的用户),流会自动使用该用户的令牌调用Graph API,避开应用程序上下文的限制。
注意事项
- 查看API文档确认权限要求:该Beta端点明确标注仅支持委托权限,应用程序权限无法生效。
- 验证身份权限:无论使用哪种方案,确保所用身份(托管标识、被模拟用户)已在Azure AD中被配置为对应PIM请求的审批者,否则即使令牌有效,仍会因权限不足报错。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

