如何通过动态同意为Entra应用授予指定Application权限?
问题解答
核心结论
无法通过动态同意(手动构造含具体权限的URL)单独指定同时存在应用权限和委托权限的应用级权限项,仅能对无对应委托权限的权限(如EduRoster.Read.All)实现这种操作。
原因说明
- Microsoft Entra ID的动态同意逻辑中,若某权限同时提供应用权限和委托权限两种类型(比如
TeamSettings.Read.All),构造URL时指定该权限名称会默认匹配委托权限,而非应用权限。 /.default范围的设计初衷是批量授予应用注册中已配置的所有应用级权限,它不支持拆分选择特定权限;但所谓的“覆盖现有权限”其实是误解——只要你在应用注册的权限列表中保留了之前已有的应用权限,使用/.default同意后,这些权限会和新添加的权限一并保留,不会被移除。
可行解决方案
方案1:预配置权限后使用/.default范围
- 登录Entra ID管理中心,找到你的应用注册,进入「API权限」页面。
- 添加
EduRoster.Read.All和TeamSettings.Read.All的应用级权限(确保选择的是「应用权限」类型,而非委托权限)。 - 构造管理员同意URL,使用
scope=https://graph.microsoft.com/.default参数。管理员完成同意后,应用会获得所有已在权限列表中配置的应用级权限,同时不影响已有的委托权限。
方案2:手动在管理中心授予权限
直接在应用注册的「API权限」页面,点击「授予管理员同意」按钮,在弹窗中选择需要添加的TeamSettings.Read.All应用权限即可。这种方式可以精准选择目标权限,完全不会影响已有的任何权限配置。
方案3:通过Microsoft Graph API自动化授予
调用POST /servicePrincipals/{servicePrincipalId}/appRoleAssignments接口,手动为应用的服务主体分配指定的应用权限:
- 先通过
GET /servicePrincipals?$filter=displayName eq '你的应用名称'获取服务主体ID。 - 通过
GET /servicePrincipals/{graphServicePrincipalId}/appRoles(Graph的服务主体ID固定为00000003-0000-0000-c000-000000000000)找到TeamSettings.Read.All和EduRoster.Read.All对应的id(即appRole ID)。 - 构造请求体发送POST请求,完成权限分配:
{ "principalId": "你的应用服务主体ID", "resourceId": "00000003-0000-0000-c000-000000000000", "appRoleId": "目标权限的appRole ID" }
内容的提问来源于stack exchange,提问作者Steve Norwood




