为什么正在使用用户帐户而不是服务主体?

问题描述

我已使用我的帐户“emj”登录并在 Jenkins 上执行以下 Azure CLI

az account show
az login --service-principal -u <<UserName>> -p <<Password>> -t <tenantID>>
az account set -s <<Subscription-123>>
az account show

下面是输出

它按预期显示用户帐户

+ az account show
{
  "environmentName": "AzureCloud","homeTenantId": "tenantID","id": "Subscription-123-ID","isDefault": true,"managedByTenants": [],"name": "Subscription-123","state": "Enabled","tenantId": "tenantID","user": {
    "name": "[email protected]","type": "user"
  }
}

以服务主体身份登录

[Pipeline] sh
+ az login --service-principal -u <<UserName>> -p <<Password>> -t <tenantID>>
[
  {
    "cloudName": "AzureCloud","id": "Subscription-456-ID","name": "Subscription-456","user": {
      "name": "servicePrincipalID","type": "servicePrincipal"
    }
  },{
    "cloudName": "AzureCloud","id": "Subscription-789-ID","isDefault": false,"managedByTenants": [
      {
        "tenantId": "tenantID"
      }
    ],"name": "Subscription-789","type": "servicePrincipal"
    }
  }
]

并设置所需的订阅

[Pipeline] sh
+ az account set -s <<Subscription-456-ID>>

虽然我希望显示服务主体,但它显示用户帐户

[Pipeline] sh
+ az account show
{
  "environmentName": "AzureCloud","type": "user"
  }
}

注意:如果不使用“az account set -s ”设置订阅,则显示服务主体帐户。

为什么显示用户帐户而不是服务主体? 'az login --service-principal -u -p -t >' 是什么意思,因为它没有被考虑在内?

解决方法

好吧,不知道为什么会这样,但是要解决这个问题,您可以在登录用户帐户/服务主体之前使用 az account clear,这样就不会混合不同的上下文。

例如,您希望通过服务主体凭据运行 Azure CLI,它应该是:

az account clear
az login --service-principal -u <<ApplicationId>> -p <<Password>> -t <tenantID>>
az account set -s <<Subscription-456-ID>>
az account show

然后,如果您想通过用户凭据进行操作,只需使用如下命令:

az account clear
az login --service-principal -u <<UserName>> -p <<Password>> -t <tenantID>>
az account set -s <<Subscription-123>>
az account show