调用RBAC checkAccess接口报500内部错误及权限校验问题咨询
RBAC单操作权限校验问题
调用RBAC checkAccess 端点时收到500错误(InternalServerError),调用实现代码如下:
var rbacUri ="https://api-dogfood.resources.windows-int.net/subscriptions/{subId}/providers/Microsoft.Authorization/checkaccess?api-version=2018-09-01-preview" var request = new RbacCheckRequest { Subject = new RbacCheckSubject { Attributes = new() { { "ObjectId", objectId } } }, Actions = new[] { new RbacCheckAction { Id = "Microsoft.Authorization/checkAccess/action" } }, Resource = new RbacCheckResource { Id = "/subscriptions/"+subscriptionId } }; var response = await client.PostAsJsonAsync(rbacUri, request, cancellationToken)
已尝试通过Microsoft.Authorization/permissions接口验证对应objectId的权限,但该接口仅返回指定objectId的全量权限列表,无法实现单操作权限的精准校验,现需要可实现指定objectId特定操作权限验证的替代方案。
可行解决方案
- 修复现有checkAccess调用问题
当前使用的是dogfood内部测试环境的2018-09-01-preview预览版接口,本身稳定性差、字段校验不规范,很容易触发500错误。替换为正式Azure ARM端点的稳定版API(版本号2022-04-01)即可,请求体需要补全必填属性:Subject.Attributes增加Type字段,值根据主体类型设为AADUser/AADServicePrincipal/AADGroup,Resource对象补充Type、Name字段,即可正常返回精准的权限校验结果。 - 调用官方封装的校验接口
可以直接调用Azure CLI/PowerShell背后的权限校验REST接口,对应接口为正式版checkAccess的封装,不需要手动处理字段兼容问题,传入objectId、待校验操作Id、目标资源Id三个参数即可直接返回允许/拒绝结果,不需要解析全量权限列表。 - 本地规则匹配实现精准校验
如果不想依赖额外的校验接口,可以基于Microsoft.Authorization/permissions返回的结果做本地匹配,匹配逻辑和Azure服务端完全一致:- 提取返回结果中的
actions/notActions(控制面权限)、dataActions/notDataActions(数据面权限)四个列表 - 先将待校验操作与
notActions/notDataActions中的规则做通配符匹配,命中则直接判定无权限 - 再将待校验操作与
actions/dataActions中的规则做通配符匹配,命中则判定有权限,否则判定无权限
注意规则中的*为通配符,比如Microsoft.Storage/storageAccounts/blobServices/containers/blobs/*会匹配所有存储blob的操作,匹配时将通配符转换为正则的.*做全字符串匹配即可,准确率和服务端校验无差异。
- 提取返回结果中的
- 基于角色分配列表校验
如果需要批量校验多个操作,可以拉取目标objectId在目标资源、父级资源组、订阅、管理组全链路范围的所有角色分配,展开每个角色对应的权限定义,按照上述通配符规则匹配即可,不需要调用全量权限查询接口,适合批量校验场景。
内容的提问来源于stack exchange,提问作者Rakshitha Yalamanchili
相关产品推荐
相关产品推荐

