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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:07:13