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

如何通过编程方式在Azure AD应用注册中暴露user_impersonation范围的API

解决PowerShell脚本创建应用注册时无法生成oauth2Permissions(含user_impersonation范围)的问题

核心原因

Azure CLI与Microsoft Graph的API在18个月间发生了更新,原有的默认自动添加user_impersonation范围的行为已被移除,需通过显式配置实现该功能。

实现方案

方案1:使用Microsoft Graph PowerShell模块配置

  1. 安装并连接Microsoft Graph应用模块:
Install-Module Microsoft.Graph.Applications -Force
Connect-MgGraph -Scopes "Application.ReadWrite.All"
  1. 获取目标应用注册的对象ID(假设已创建应用,$appId为应用ID):
$app = Get-MgApplication -Filter "appId eq '$appId'"
  1. 构建并添加user_impersonation权限配置:
$userImpersonationPermission = @{
    AdminConsentDescription = "允许应用代表用户访问API"
    AdminConsentDisplayName = "代表用户访问"
    Id = [Guid]::NewGuid().ToString() # 生成唯一权限ID
    IsEnabled = $true
    Type = "User"
    UserConsentDescription = "允许应用代表您访问API"
    UserConsentDisplayName = "代表您访问"
    Value = "user_impersonation"
}

Update-MgApplication -ApplicationId $app.Id -Oauth2Permissions @($userImpersonationPermission)

方案2:结合Azure CLI与Manifest文件更新

  1. 导出目标应用的Manifest:
az ad app show --id $appId --output json > app-manifest.json
  1. 编辑app-manifest.json,添加oauth2Permissions节点(若已存在则替换或追加):
"oauth2Permissions": [
    {
        "adminConsentDescription": "允许应用代表用户访问API",
        "adminConsentDisplayName": "代表用户访问",
        "id": "生成的唯一GUID",
        "isEnabled": true,
        "type": "User",
        "userConsentDescription": "允许应用代表您访问API",
        "userConsentDisplayName": "代表您访问",
        "value": "user_impersonation"
    }
]
  1. 导入更新后的Manifest:
az ad app update --id $appId --manifest @app-manifest.json

方案3:直接调用Microsoft Graph REST API(适配混合脚本场景)

如果脚本中已在调用Graph API,可直接发送PATCH请求完成配置:

$graphEndpoint = "https://graph.microsoft.com/v1.0/applications/$($app.Id)"
$authHeaders = @{
    "Authorization" = "Bearer $accessToken" # 需提前获取有效的Graph访问令牌
    "Content-Type" = "application/json"
}
$permissionBody = @{
    oauth2Permissions = @(
        @{
            adminConsentDescription = "允许应用代表用户访问API"
            adminConsentDisplayName = "代表用户访问"
            id = [Guid]::NewGuid().ToString()
            isEnabled = $true
            type = "User"
            userConsentDescription = "允许应用代表您访问API"
            userConsentDisplayName = "代表您访问"
            value = "user_impersonation"
        }
    )
} | ConvertTo-Json

Invoke-RestMethod -Uri $graphEndpoint -Method PATCH -Headers $authHeaders -Body $permissionBody

关键注意事项

  • 每个oauth2Permissions条目必须使用唯一的Id,需生成新的GUID,不可复用其他应用的权限ID
  • 调用操作需具备足够权限:需Application.ReadWrite.All或Directory.AccessAsUser.All权限
  • 若应用已存在其他oauth2Permissions,使用PATCH时需将原有权限条目与新条目一并传入,避免覆盖原有配置

内容的提问来源于stack exchange,提问作者user871967

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:43:12