使用Rest API重新生成ACR访问密钥时遇未授权问题求助
问题核心
调用ACR Rest API重新生成访问密钥时返回Forbidden错误,明确提示客户端缺少Microsoft.ContainerRegistry/registries/regenerateCredential/action权限,或请求的资源范围无效。错误详情:
Microsoft.Azure.Deployment.Express.Server.Common.Management.AzureResourceManagementException: Failed to regenerate Password: 'password'. HttpStatusCode 'Forbidden', Reason phrase:'Forbidden' and Content:'{"error":{"code":"AuthorizationFailed","message":"The client 'xxxxxxxxxxxxxxx' with object id 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' does not have authorization to perform action 'Microsoft.ContainerRegistry/registries/regenerateCredential/action' over scope '/subscriptions/xxxxxxxxxxxxx/resourceGroups/xxxxxxxxxxxxxxxxx/providers/Microsoft.ContainerRegistry/registries/xxxxxxxxxxxx' or the scope is invalid. If access was recently granted, please refresh your credentials."}}'
解决步骤
配置对应RBAC权限
针对对象ID为xxxxxxxxxxxxxxxxxxxxxxxxxxxxx的客户端,在目标ACR资源范围内分配包含Microsoft.ContainerRegistry/registries/regenerateCredential/action权限的角色:- 推荐使用内置角色:ACR管理员(包含ACR全管理权限);若需最小权限,可创建自定义角色仅添加该动作权限
- 确保权限分配的范围严格匹配错误信息中的ACR资源路径,避免选错订阅、资源组或注册表名称
确认权限生效
- 刚分配的RBAC权限可能需要5-10分钟同步,等待后重新尝试;或刷新客户端的身份凭据(如重新获取OAuth2 token)
- 可通过Azure CLI验证权限分配:
检查输出是否包含有权限的角色名称az role assignment list --assignee <客户端对象ID> --scope <ACR资源范围> --query "[].roleDefinitionName"
验证资源范围有效性
核对请求中使用的scope路径:- 确认订阅ID、资源组名称、ACR注册表名称与Azure门户中实际资源完全一致,避免拼写错误
- 确保路径格式正确,层级为
/subscriptions/{订阅ID}/resourceGroups/{资源组名}/providers/Microsoft.ContainerRegistry/registries/{注册表名}
排查特殊身份问题
- 若使用服务主体,检查服务主体是否处于启用状态,凭据未过期
- 若使用托管身份,确认身份已正确关联到调用方资源,且身份本身已被分配对应ACR权限
内容的提问来源于stack exchange,提问作者user23556637

