使用适用于 Go 的 Azure 标识模块进行 Azure 身份验证

在本教程中, 用于 Go 的 Azure 标识模块中的 DefaultAzureCredential 类型用于向 Azure 进行身份验证。 Azure 标识模块提供了多种凭据类型,这些凭据类型侧重于使用 Microsoft Entra ID 的 OAuth。

DefaultAzureCredential 通过组合常用凭据类型来简化身份验证。 它链式凭据类型,用于使用用于在开发环境中进行身份验证的凭据类型对 Azure 部署的应用程序进行身份验证。

先决条件

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。

1. 安装适用于 Go 的 Azure 标识模块

运行以下命令下载 azidentity 模块:

go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity

2. 向 Azure 进行身份验证

使用 DefaultAzureCredential 通过以下方法之一向 Azure 进行身份验证:

要详细了解不同的凭据类型,请参阅凭据类型

选项 1:定义环境变量

DefaultAzureCredential 使用 EnvironmentCredential 类型来配置使用环境变量的身份验证,该身份验证支持三种身份验证类型。 从以下身份验证类型中选择,并定义合适的环境变量。

具有机密的服务主体

变量名称
AZURE_CLIENT_ID Azure 服务主体的应用程序 ID
AZURE_TENANT_ID 应用程序的 Microsoft Entra 租户的 ID
AZURE_CLIENT_SECRET Azure 服务主体的密码
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

具有证书的服务主体

变量名称
AZURE_CLIENT_ID Microsoft Entra 应用程序的 ID
AZURE_TENANT_ID 应用程序的 Microsoft Entra 租户的 ID
AZURE_CLIENT_CERTIFICATE_PATH 包括私钥的证书文件的路径(无密码保护)
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

用户名和密码

变量名称
AZURE_CLIENT_ID Microsoft Entra 应用程序的 ID
AZURE_USERNAME 用户名(通常为电子邮件地址)
AZURE_PASSWORD 该用户的密码
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_USERNAME="<azure_username>"
export AZURE_PASSWORD="<azure_user_password>"

按上述顺序尝试配置。 例如,如果客户端机密和证书的值都存在,则使用客户端机密。

选项 2:使用工作负荷标识

Microsoft Entra 工作负荷 ID 使 Kubernetes 群集中的 Pod 能够使用 Kubernetes 标识(服务帐户)。 颁发 Kubernetes 令牌, OIDC 联合 使 Kubernetes 应用程序能够使用 Microsoft Entra ID 安全地访问 Azure 资源。

如果不存在所需的环境变量 EnvironmentCredentialDefaultAzureCredential 则尝试使用 WorkloadIdentityCredential 进行身份验证。 WorkloadIdentityCredential 尝试从工作负荷标识 Webhook 设置的环境变量中读取服务主体配置。

选项 3:使用托管标识

托管标识使开发人员无需管理凭据。 通过连接到支持 Microsoft Entra 身份验证的资源,应用程序可以使用 Microsoft Entra 令牌而不是凭据。

如果不存在所需的环境变量 WorkloadIdentityCredentialDefaultAzureCredential 则尝试使用 ManagedIdentityCredential 进行身份验证。

如果使用用户分配的托管标识,请运行以下命令来设置 AZURE_CLIENT_ID 环境变量。

export AZURE_CLIENT_ID="<user_assigned_managed_identity_client_id>"

选项 4:使用 Azure CLI 登录

若要减少本地开发中的摩擦, DefaultAzureCredential 可以在用户登录到 Azure CLI 时进行身份验证。

运行以下命令登录 Azure CLI:

az login

Azure CLI 身份验证不推荐用于在 Azure 中运行的应用程序。

3. 使用 DefaultAzureCredential 对 ResourceClient 进行身份验证

创建一 azure-auth 个名为测试 Azure 身份验证的新示例 Go 模块,其中包含 DefaultAzureCredential

  1. 创建一个目录来测试并运行示例 Go 代码,然后切换到该目录。

  2. 运行 go mod init 以创建模块:

    go mod init azure-auth
    
  3. 运行 go 即可 下载、生成和安装必要的 Azure SDK for Go 模块:

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    
  4. 创建名为 main.go 的文件并插入下列代码:

    package main
    
    import (
      "context"
    
      "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
      "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    )
    
    const subscriptionID = "<subscription ID>"
    
    func main() {
      cred, err := azidentity.NewDefaultAzureCredential(nil)
      if err != nil {
        // TODO: handle error
      }
      // Azure SDK Resource Management clients accept the credential as a parameter.
      // The client will authenticate with the credential as necessary.
      client, err := armsubscription.NewSubscriptionsClient(cred, nil)
      if err != nil {
        // TODO: handle error
      }
      _, err = client.Get(context.TODO(), subscriptionID, nil)
      if err != nil {
        // TODO: handle error
      }
    }   
    
    

    <subscription ID> 替换为订阅 ID。

  5. 运行 go run 以生成并运行应用程序:

    go run .
    

使用 DefaultAzureCredential 向 Azure 进行身份验证

在应用程序中使用以下代码通过 Azure 标识模块 DefaultAzureCredential向 Azure 进行身份验证:

// This credential type checks environment variables for configuration.
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
  // handle error
}

// Azure Resource Management clients accept the credential as a parameter
client, err := armresources.NewClient("<subscriptionId>", cred, nil)
if err != nil {
  // handle error
}

疑难解答

有关解决特定凭据类型错误的指导,请参阅 故障排除指南

后续步骤