问题描述
我有一个服务主体,它对订阅具有所有者访问权限,除非进行一些网络操作。在同一个订阅中,我有一个资源组,我在其中创建了 ACR。我正在尝试使用我的服务主体登录 acr,但它抛出了拒绝访问错误。
由于 SP 具有所有者权限,我希望它可以登录 ACR。
az login --service-principal -u *** --password=*** --tenant *** --allow-no-subscriptions az acr 登录 --name myregistry
警告:无法通过消息获取 AAD 授权令牌:发生错误:CONNECTIVITY_REFRESH_TOKEN_ERROR 访问注册表“acrshto01.azurecr.io”被拒绝。响应代码:403。请再次尝试运行“az login”以刷新权限。
解决方法
CONNECTIVITY_REFRESH_TOKEN_ERROR 可能发生在用户对注册表没有正确权限或 Azure CLI 的用户凭据过时。
如果您的帐户对注册表具有正确的权限,请运行 az login 以刷新权限、令牌和凭据。 参考:https://docs.microsoft.com/en-us/azure/container-registry/container-registry-health-error-reference#connectivity_refresh_token_error
看起来你的服务原则在创建时没有被授予所需的权限
为了向您的服务主体授予注册中心访问权限,您可以为服务主体分配一个新角色。
以下脚本使用 az role assignment create 命令向您在 SERVICE_PRINCIPAL_ID
变量中指定的服务主体授予所有者权限。
#!/bin/bash
# Modify for your environment. The ACR_NAME is the name of your Azure Container
# Registry,and the SERVICE_PRINCIPAL_ID is the service principal's 'appId' or
# one of its 'servicePrincipalNames' values.
ACR_NAME=mycontainerregistry
SERVICE_PRINCIPAL_ID=<service-principal-ID>
# Populate value required for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)
# Assign the desired role to the service principal. Modify the '--role' argument
az role assignment create --assignee $SERVICE_PRINCIPAL_ID --scope $ACR_REGISTRY_ID --role owner