使用Java调用Microsoft Graph API授予管理员同意的相关问题
问题根因
你当前的代码仅完成了配置应用所需权限列表的操作,也就是修改了应用注册对象的requiredResourceAccess属性,仅相当于声明了应用需要哪些权限,并未实际完成授权步骤,因此在UI中看不到权限已授予的状态。
解决方案
完全可以通过Graph API直接完成管理员同意授权,无需手动操作UI界面,两种权限的授予方式分别如下:
1. 应用权限(AppRole,对应type为Role的权限)
调用服务主体的appRoleAssignments接口完成授予,示例代码如下:
AppRoleAssignment assignment = new AppRoleAssignment(); assignment.principalId = UUID.fromString(clientServicePrincipalId); // 客户端应用的服务主体ID assignment.resourceId = UUID.fromString(resSerPrinId); // 资源服务主体ID assignment.appRoleId = UUID.fromString(appRoleId); // 要授予的应用角色ID graphClient.servicePrincipals(clientServicePrincipalId) .appRoleAssignments() .buildRequest() .post(assignment);
2. 委托权限(OAuth2PermissionScope,对应type为Scope的权限)
调用oauth2PermissionGrants接口完成租户级管理员同意,示例代码如下:
OAuth2PermissionGrant grant = new OAuth2PermissionGrant(); grant.clientId = clientServicePrincipalId; // 客户端应用的服务主体ID grant.resourceId = resSerPrinId; // 资源服务主体ID grant.consentType = "AllPrincipals"; // 租户级管理员同意,所有用户生效 grant.scope = permissionScopeValue; // 要授予的委托权限的value值,比如"User.Read.All" graphClient.oauth2PermissionGrants() .buildRequest() .post(grant);
注意事项
- 执行上述授予操作的身份,需要持有全局管理员、应用管理员或云应用管理员等具备管理员同意权限的Azure AD角色。
- 授权操作的操作对象是服务主体(servicePrincipal),而非应用注册(application)对象,注意不要混淆两个对象的ID。
- 如果需要批量授予多个权限,可以循环调用上述接口分别授予即可。
内容的提问来源于stack exchange,提问作者Sharad esdee Dutta
相关产品推荐
相关产品推荐

