如何通过Microsoft Graph为用户或组分配应用角色?
用Microsoft Graph给用户/组分配应用角色的完整方案
嘿,我之前也遇到过和你一样的困惑——一开始查资料好多都是旧的Azure AD Graph内容,但其实Microsoft Graph早就支持应用角色分配了,不管是v1.0还是beta端点都能用,下面给你拆解清楚怎么做:
一、先搞清楚三个关键ID
要完成分配,你得先拿到这三个ID(前两个你应该已经能获取了,第三个需要额外查一下):
- Principal ID:就是你要分配的用户ID或者组ID(你已经能获取用户/组,这个没问题)
- Resource ID:不是应用注册的Client ID!是目标应用的服务主体(Service Principal)ID——你可以通过调用
GET /servicePrincipals?$filter=appId eq '{你的应用Client ID}'来获取这个ID - App Role ID:你要分配的那个应用角色的ID,来自目标应用注册里定义的应用角色,或者调用
GET /servicePrincipals/{service-principal-id}/appRoles来返回所有可用角色,找到对应角色的id字段
二、API调用方式(v1.0已正式可用)
给用户分配应用角色
发送POST请求到:POST https://graph.microsoft.com/v1.0/users/{user-id}/appRoleAssignments
请求体是JSON格式:
{ "principalId": "用户ID", "resourceId": "应用服务主体ID", "appRoleId": "要分配的应用角色ID" }
给组分配应用角色
类似地,发送POST请求到:POST https://graph.microsoft.com/v1.0/groups/{group-id}/appRoleAssignments
请求体结构和上面完全一致,只是principalId换成组的ID就行。
三、Microsoft Graph SDK代码示例(C#为例)
如果你用的是Graph SDK,代码会更简洁:
用户分配示例
using Microsoft.Graph; using System; using System.Threading.Tasks; public async Task AssignAppRoleToUser(GraphServiceClient graphClient, string userId, string servicePrincipalId, string appRoleId) { var appRoleAssignment = new AppRoleAssignment { PrincipalId = Guid.Parse(userId), ResourceId = Guid.Parse(servicePrincipalId), AppRoleId = Guid.Parse(appRoleId) }; await graphClient.Users[userId].AppRoleAssignments .Request() .AddAsync(appRoleAssignment); }
组分配示例
public async Task AssignAppRoleToGroup(GraphServiceClient graphClient, string groupId, string servicePrincipalId, string appRoleId) { var appRoleAssignment = new AppRoleAssignment { PrincipalId = Guid.Parse(groupId), ResourceId = Guid.Parse(servicePrincipalId), AppRoleId = Guid.Parse(appRoleId) }; await graphClient.Groups[groupId].AppRoleAssignments .Request() .AddAsync(appRoleAssignment); }
四、关键注意事项
- 权限要求:如果是用应用身份调用(比如后台服务),需要申请
AppRoleAssignment.ReadWrite.All应用权限并获得管理员同意;如果是委派身份(用户登录后调用),需要Directory.AccessAsUser.All或者AppRoleAssignment.ReadWrite.All委派权限,同样需要管理员同意 - 应用角色的适配性:要分配的应用角色的
allowedMemberTypes必须包含User(给用户分配)或Group(给组分配),否则会报错 - 默认访问角色:如果目标应用没有自定义应用角色,你可以用默认的“用户访问”角色,它的ID固定是
00000000-0000-0000-0000-000000000000,分配这个ID就代表给用户/组授予该应用的默认访问权限
内容的提问来源于stack exchange,提问作者Lionel R.
相关产品推荐
相关产品推荐

