使用 Azure SDK for Go 向 Azure 服务验证 Go 应用

当应用程序需要访问 Azure 资源(如 Azure 存储、Azure Key Vault 或 Azure AI 服务)时,必须向 Azure 进行身份验证。 对于所有应用程序(无论是部署到 Azure、部署在本地还是在本地开发人员工作站上进行开发)而言,此要求都是如此。 本文介绍使用 Azure SDK for Go 时向 Azure 验证应用的建议方法。

对 Azure 资源进行身份验证时,请使用基于令牌的身份验证,而不是应用的连接字符串。 Azure SDK for Go 提供支持基于令牌的身份验证的机制。 无论应用是在本地开发中、部署到 Azure 还是部署到本地服务器,应用都可以无缝地向 Azure 资源进行身份验证。

应用用来向 Azure 资源进行身份验证的特定类型的基于令牌的身份验证取决于应用在何处运行。 下图显示了基于令牌的身份验证类型。

显示应用的推荐基于令牌的身份验证策略的示意图,具体取决于应用的运行位置。

  • 当开发人员在本地开发期间运行应用时: 应用通过本地开发所用的应用服务主体或开发人员的 Azure 凭据向 Azure 进行身份验证。 这些选项在本地开发期间的身份验证一节中介绍。
  • 当应用托管在 Azure 上时: 应用使用托管标识向 Azure 资源进行身份验证。 此选项在服务器环境中的身份验证一节中讨论。
  • 在本地托管和部署应用时: 应用使用应用程序服务主体向 Azure 资源进行身份验证。 在服务器环境 身份验证部分中讨论了此选项。

DefaultAzureCredential

Azure SDK 提供的 DefaultAzureCredential 类型允许应用使用不同的身份验证方法,具体取决于其运行环境。 这样,就可以将应用从本地开发升级到测试环境,而无需更改代码。

为每个环境配置适当的身份验证方法,DefaultAzureCredential 会自动检测和使用该身份验证方法。 建议使用 DefaultAzureCredential 代替手动编码条件逻辑或使用功能标志,这样可以在不同的环境中采用不同的身份验证方法。

有关使用 DefaultAzureCredential 类型的详细信息,请参阅 在应用程序中使用 DefaultAzureCredential 一节。

基于令牌的身份验证的优点

生成适用于 Azure 的应用时,请使用基于令牌的身份验证,而不是使用连接字符串。 与使用连接字符串进行身份验证相比,基于令牌的身份验证具有以下优势:

  • 本文中所述的基于令牌的身份验证方法允许你在 Azure 资源上建立应用所需的特定权限。 这种做法遵循最低特权原则原则。 相比之下,连接字符串授予对 Azure 资源的完整权限。
  • 任何具有连接字符串的应用都可以连接到 Azure 资源,但基于令牌的身份验证方法将资源的访问范围限定为仅用于访问资源的应用。
  • 使用托管标识时,没有需要存储的应用程序机密。 该应用更安全,因为没有可以泄露的连接字符串或应用程序机密。
  • Azure SDK 中的 azidentity 包在后台为你管理令牌。 托管令牌使使用基于令牌的身份验证变得像连接字符串一样简单。

将连接字符串的使用限制为无法访问生产或敏感数据的初始概念证明应用或开发原型。 否则,Azure SDK 中提供的基于令牌的身份验证在向 Azure 资源进行身份验证时始终首选。

服务器环境中的身份验证

当在服务器环境中托管时,每个应用程序都会为其运行的每个环境分配一个唯一的应用程序标识。 在 Azure 中,应用标识由 服务主体表示。 此特殊类型的安全主体可识别应用并将其身份验证到 Azure。 要用于应用的服务主体类型取决于应用正在运行的位置:

身份验证方法 描述
在 Azure 中托管的应用 Azure 中托管的应用应该使用托管标识服务主体。 托管标识旨在表示 Azure 中托管的应用的标识,只能与 Azure 托管的应用一起使用。

例如,将为 Azure 容器应用中托管的 Gin Web 应用分配托管标识。 然后,分配给应用的托管标识将用于向其他 Azure 服务对应用进行身份验证。

在 Azure Kubernetes 服务(AKS)中运行的应用可以使用工作负荷标识凭据。 此凭据基于与 AKS 服务帐户具有信任关系的托管标识。

托管在 Azure 外部的应用
(例如,本地应用)
在 Azure 外部托管的应用(例如,需要连接到 Azure 服务的本地应用)应使用 应用程序服务主体。 应用程序服务主体表示 Azure 中的应用标识,并通过应用程序注册过程创建。

例如,请考虑使用 Azure Blob 存储的本地托管的 Gin Web 应用。 使用应用注册过程为应用创建应用程序服务主体。 AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET 都将存储为在运行时由应用程序读取的环境变量,并允许应用使用应用程序服务主体向 Azure 进行身份验证。

在本地开发期间进行身份验证

当应用程序在本地开发期间在开发人员工作站上运行时,它仍必须向应用使用的任何 Azure 服务进行身份验证。 在本地开发期间,有两个主要策略用于向 Azure 验证应用:

身份验证方法 描述
创建在本地开发期间要使用的专用应用程序服务主体对象。 在此方法中,使用应用注册过程设置专用 应用程序服务主体 对象,以便在本地开发期间使用。 然后,将服务主体的身份存储为环境变量,以便应用在本地开发环境中运行时访问。

此方法允许你将应用所需的特定资源权限分配给开发人员在本地开发期间使用的服务主体对象。 这种做法可确保应用程序仅有权访问它所需的特定资源,并复制应用在生产环境中拥有的权限。

此方法的缺点是,需要为每个在应用程序中工作的开发人员创建单独的服务主体对象。

在本地开发期间,使用开发人员的凭据向 Azure 验证应用。 在此方法中,开发人员必须从本地工作站上的 Azure CLI 或 Azure 开发人员 CLI 登录到 Azure。 然后,应用程序可以从凭据存储访问开发人员的凭据,并使用这些凭据从应用访问 Azure 资源。

此方法的优点是更容易设置,因为开发人员只需通过上述开发人员工具之一登录到其 Azure 帐户。 此方法的缺点是,开发人员的帐户可能比应用程序所需的权限更多。 因此,应用程序不会准确复制在生产环境中运行的权限。

在应用程序中使用 DefaultAzureCredential

DefaultAzureCredential 是用于对 Microsoft Entra ID 进行身份验证的有序机制序列。 每个身份验证机制都是实现 TokenCredential 接口的类,称为 凭据。 在运行时,DefaultAzureCredential 尝试使用第一个凭据进行身份验证。 如果该凭据无法获取访问令牌,则会尝试序列中的下一个凭据,依此方式,直到成功获取访问令牌。 这样,你的应用可以在不同的环境中使用不同的凭据,而无需编写特定于环境的代码。

若要在 Go 应用中使用 DefaultAzureCredential,请将 azidentity 包添加到应用程序中。

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

以下代码示例演示如何使用 DefaultAzureCredential创建 Azure SDK 客户端的实例。 在这种情况下,azblob 客户端用于访问 Azure Blob 存储。

import (
	"context"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

const (
	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
	containerName = "sample-container"
	blobName      = "sample-blob"
	sampleFile    = "path/to/sample/file"
)

func main() {
    // create a credential
    cred, err := azidentity.NewDefaultAzureCredential(nil)
    if err != nil {
      // TODO: handle error
    }
    
    // create a client for the specified storage account
    client, err := azblob.NewClient(account, cred, nil)
    if err != nil {
      // TODO: handle error
    }
    
    // TODO: perform some action with the azblob Client
    // _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}

在本地开发工作站上运行上述代码时,它会在应用程序服务主体的环境变量或本地安装的开发人员工具(如 Azure CLI)中查找一组开发人员凭据。 两种方法都可用于在本地开发期间向 Azure 资源验证应用。

部署到 Azure 时,此相同代码还可以向 Azure 资源验证应用。 DefaultAzureCredential 可以检索环境设置和托管标识配置,以便自动向 Azure 服务进行身份验证。