如何通过ARM模板或Graph API配置读取Entra ID诊断设置权限
多租户应用自动分配Entra ID诊断设置权限方案
我们有一款部署在客户环境的多租户应用,需通过Microsoft Graph和Azure PowerShell采集数据,目前尝试读取Entra ID诊断设置的代码如下:
$accessToken = (Get-AzAccessToken -ResourceUrl "https://management.azure.com").Token $apiEndpoint = "https://management.azure.com/providers/microsoft.aadiam/diagnosticSettings?api-version=2017-04-01-preview" $headers = @{ "Authorization" = "Bearer $accessToken" "Content-Type" = "application/json" } $response = Invoke-RestMethod -Uri $apiEndpoint -Headers $headers -Method Get
运行时遇到权限错误:
"message": "The client 'blabla' with object id 'blabla' does not have authorization to perform action 'microsoft.aadiam/diagnosticSettings/write' over scope '/providers/microsoft.aadiam/diagnosticSettings/testDiagSetting' or the scope is invalid. If access was recently granted, please refresh your credentials."
手动执行以下命令可解决问题,但希望避免管理员手动操作,以下是两种自动实现方案:
一、通过ARM模板自动分配权限
可以直接在部署应用的ARM模板中添加角色分配资源,实现自动化权限配置。
ARM模板示例
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "servicePrincipalObjectId": { "type": "string", "metadata": { "description": "多租户应用服务主体的ObjectId" } }, "aadIamScope": { "type": "string", "defaultValue": "/providers/Microsoft.aadiam", "metadata": { "description": "Entra ID诊断设置的资源范围" } } }, "variables": { // Contributor角色的固定ID,若需更精细权限可替换为自定义角色ID "contributorRoleId": "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c" }, "resources": [ { "type": "Microsoft.Authorization/roleAssignments", "apiVersion": "2022-04-01", "name": "[guid(parameters('servicePrincipalObjectId'), parameters('aadIamScope'), variables('contributorRoleId'))]", "properties": { "roleDefinitionId": "[variables('contributorRoleId')]", "principalId": "[parameters('servicePrincipalObjectId')]", "scope": "[parameters('aadIamScope')]", "principalType": "ServicePrincipal" } } ] }
注意事项
- 部署模板的用户需具备所有者或用户访问管理员权限,才能创建角色分配。
- 若无需完整Contributor权限,建议创建自定义角色,仅包含
microsoft.aadiam/diagnosticSettings/*权限,降低权限过大的安全风险。 - 多租户场景下,需确保部署上下文指向客户的目标租户。
二、通过Microsoft Graph API实现权限分配
可借助Microsoft Graph的Azure RBAC管理端点自动创建角色分配,同时可通过管理员同意流程让客户授权应用完成操作。
1. 配置应用权限
在应用注册中添加RoleAssignment.ReadWrite.Directory应用权限(需客户管理员同意),或使用委托权限(需管理员交互授权)。
2. 调用Graph API创建角色分配
获取有效访问令牌后,发送POST请求创建角色分配:
POST https://graph.microsoft.com/v1.0/roleManagement/azure/roleAssignments Content-Type: application/json { "principalId": "e348be5c-fc9b-4852-8e04-540093bd461b", "roleDefinitionId": "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c", "directoryScopeId": "/providers/Microsoft.aadiam" }
注意事项
- 管理员同意流程可通过构造授权URL引导客户完成,无需手动执行命令。
- 同样推荐使用自定义角色缩小权限范围,遵循最小权限原则。
内容的提问来源于stack exchange,提问作者83jahs8
相关产品推荐
相关产品推荐

