如何通过编程方式在Azure AD应用注册中暴露user_impersonation范围的API
解决PowerShell脚本创建应用注册时无法生成oauth2Permissions(含user_impersonation范围)的问题
核心原因
Azure CLI与Microsoft Graph的API在18个月间发生了更新,原有的默认自动添加user_impersonation范围的行为已被移除,需通过显式配置实现该功能。
实现方案
方案1:使用Microsoft Graph PowerShell模块配置
- 安装并连接Microsoft Graph应用模块:
Install-Module Microsoft.Graph.Applications -Force Connect-MgGraph -Scopes "Application.ReadWrite.All"
- 获取目标应用注册的对象ID(假设已创建应用,
$appId为应用ID):
$app = Get-MgApplication -Filter "appId eq '$appId'"
- 构建并添加
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文件更新
- 导出目标应用的Manifest:
az ad app show --id $appId --output json > app-manifest.json
- 编辑
app-manifest.json,添加oauth2Permissions节点(若已存在则替换或追加):
"oauth2Permissions": [ { "adminConsentDescription": "允许应用代表用户访问API", "adminConsentDisplayName": "代表用户访问", "id": "生成的唯一GUID", "isEnabled": true, "type": "User", "userConsentDescription": "允许应用代表您访问API", "userConsentDisplayName": "代表您访问", "value": "user_impersonation" } ]
- 导入更新后的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
相关产品推荐
相关产品推荐

