使用Bicep添加API权限仅显示其他已授予权限,如何实现管理员同意?
使用Bicep为应用注册添加API权限并完成管理员同意的正确步骤
问题原因分析
你遇到的「权限显示在其他已授予权限」的情况,是因为当前使用的oauth2PermissionGrants资源是针对**委托权限(Delegated Permissions)**的租户级管理员同意,这种通过Graph API直接授予的同意,在Entra ID门户中会被归类到「其他已授予权限」,而非直接显示在「API权限」的已授予列表中。但这并不影响权限的生效,只是展示位置不同。
如果你的目标是让权限显示在「已授予的权限」列表(如你提供的示例截图),需要先明确你要授予的是委托权限还是应用权限,再调整Bicep代码。
针对委托权限的调整(保持权限生效,优化显示)
如果确实需要委托权限的Policy.Read.All,可以确保requiredResourceAccess中的权限配置与oauth2PermissionGrants的scope完全匹配,虽然门户仍可能显示在「其他已授予权限」,但权限已正常生效。需要确认:
requiredResourceAccess中的resourceAccessID和type正确对应委托权限- 授予的
scope字符串与权限名称完全一致(你的代码中已经匹配:Policy.Read.All对应ID246dd0d5-5bd0-4def-940b-0421030a5b68)
针对应用权限的正确配置(显示在已授予列表)
如果你的场景需要的是应用权限(无需用户上下文的后台访问),则需要修改代码,使用appRoleAssignments资源来完成管理员同意,这样权限会显示在「API权限」的已授予列表中:
修改后的示例代码
targetScope = 'tenant' // entra-external-setup.bicep extension microsoftGraph param appName string = 'cspm' param deployEnvironment string = 'lb' var applicationRegistrationName = '${appName}-${deployEnvironment}-app-01' var redirectUris = deployEnvironment == 'prod' ? ['https://app.${appName}.io'] : ['https://${applicationRegistrationName}.azurewebsites.net', 'https://localhost:44305'] resource microsoftGraphServicePrincipal 'Microsoft.Graph/servicePrincipals@v1.0' existing = { appId: '00000003-0000-0000-c000-000000000000' } resource applicationRegistration 'Microsoft.Graph/applications@v1.0' = { uniqueName: applicationRegistrationName displayName: applicationRegistrationName web: { redirectUris: [for item in redirectUris: '${item}/sigin-oidc'] implicitGrantSettings: { enableIdTokenIssuance: true } } requiredResourceAccess: [ { resourceAppId: microsoftGraphServicePrincipal.appId resourceAccess: [ { // 应用权限Policy.Read.All的ID id: '15db9108-108e-4709-879c-81382c8bf4a9' type: 'Role' // 应用权限使用Role类型 } ] } ] } resource applicationRegistrationServicePrincipal 'Microsoft.Graph/servicePrincipals@v1.0' = { appId: applicationRegistration.appId } // 应用权限的管理员同意:使用appRoleAssignments resource appRoleAssignment 'Microsoft.Graph/servicePrincipals/${applicationRegistrationServicePrincipal.name}/appRoleAssignments@v1.0' = { principalId: applicationRegistrationServicePrincipal.id resourceId: microsoftGraphServicePrincipal.id appRoleId: '15db9108-108e-4709-879c-81382c8bf4a9' // 对应应用权限的ID }
关键注意事项
- 权限类型区分:委托权限用
oauth2PermissionGrants,应用权限用appRoleAssignments,两者不可混用 - 权限ID验证:确保使用的权限ID与权限类型(委托/应用)匹配,可以通过Graph API查询服务主体的
oauth2PermissionScopes(委托权限)或appRoles(应用权限)来获取正确ID - 部署权限:执行Bicep部署的账号需要拥有Entra ID的全局管理员、应用程序管理员或云应用程序管理员权限,才能完成管理员同意操作
内容的提问来源于stack exchange,提问作者Mike Dzikowski
相关产品推荐
相关产品推荐

