如何通过Microsoft Graph API替代Azure Portal实现用户应用角色分配
通过Microsoft Graph API实现应用角色分配
一、准备必要权限
首先得确保你用来调用Graph API的服务主体(如果用用户身份调用,该用户需是管理员)拥有**AppRoleAssignment.ReadWrite.All权限——这是最小权限,也可用权限更大的Directory.ReadWrite.All,但尽量遵循最小权限原则。注意这个权限必须经过全局管理员或特权角色管理员同意**,因为应用角色分配属于敏感操作。
二、获取三个核心ID
调用API前必须拿到以下三个ID:
- 用户ID:目标用户的
objectId。调用GET /users/{userPrincipalName}(替换{userPrincipalName}为用户邮箱或用户主体名),取返回结果里的id字段。 - 服务主体ID:要分配角色的应用对应的服务主体
objectId。调用GET /servicePrincipals?$filter=displayName eq '{应用显示名称}',找到对应应用的id字段。 - 应用角色ID:要分配的具体应用角色的
id。调用GET /servicePrincipals/{服务主体ID},在返回的appRoles数组中,找到allowedMemberTypes包含"User"的目标角色,取它的id字段(给服务主体分配角色才选包含"Application"的)。
三、调用API创建分配
用POST请求调用POST /users/{用户ID}/appRoleAssignments,请求体格式如下:
{ "principalId": "{用户的objectId}", "resourceId": "{应用服务主体的objectId}", "appRoleId": "{目标应用角色的id}" }
PowerShell示例(用Microsoft Graph模块)
先安装模块并登录(确保登录账号有管理员权限):
Install-Module Microsoft.Graph -Scope CurrentUser -Force Connect-MgGraph -Scopes "AppRoleAssignment.ReadWrite.All"
然后执行分配:
# 替换成你的实际ID $userId = "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" $resourceId = "yyyyyy-yyyy-yyyy-yyyy-yyyyyyyyy" $appRoleId = "zzzzzz-zzzz-zzzz-zzzz-zzzzzzzzz" $params = @{ principalId = $userId resourceId = $resourceId appRoleId = $appRoleId } New-MgUserAppRoleAssignment -UserId $userId -BodyParameter $params
HTTP请求示例(比如用Postman)
- 请求方法:POST
- 请求URL:
https://graph.microsoft.com/v1.0/users/{用户ID}/appRoleAssignments - 请求头:
Authorization: Bearer {你的访问令牌}(令牌需包含AppRoleAssignment.ReadWrite.All权限) - 请求体:替换占位符后的上述JSON内容
四、验证分配结果
可以通过两种方式验证:
- 调用
GET /users/{用户ID}/appRoleAssignments,查看返回列表是否包含刚创建的分配项 - 调用
GET /servicePrincipals/{服务主体ID}/appRoleAssignedTo,查看该应用下的角色分配列表,确认目标用户在列
内容的提问来源于stack exchange,提问作者Shivlord
相关产品推荐
相关产品推荐

