使用 Azure SDK for Go 进行身份验证(旧版)
重要
本文适用于 Azure SDK for Go 的旧版本。 若要对 最新模块 进行身份验证, 请使用 Azure 标识 包。
Azure SDK for Go 提供多种方式来使用 Azure 进行身份验证。 可通过不同的身份验证方法调用这些身份验证类型。 本文介绍可用的类型、方法以及如何选择最适合应用程序的方法。
可用的身份验证类型和方法
Azure SDK for Go 提供使用不同凭据集的多种身份验证类型。 可通过不同的身份验证方法使用每种身份验证类型,该 SDK 也正是通过这些方法将这些凭据用作输入。 下表描述了可用的身份验证类型,以及在哪些场合下建议让应用程序使用这些类型。
Authentication type | 建议的使用场合... |
---|---|
基于证书的身份验证 | 你拥有为 Microsoft Entra 用户或服务主体配置的 X509 证书。 若要了解详细信息,请参阅 Microsoft Entra ID 中基于证书的身份验证入门。 |
客户端凭据 | 已配置一个服务主体,该服务主体是针对此应用程序或它所属的应用程序类设置的。 有关详细信息,请参阅使用 Azure CLI 创建服务主体。 |
Azure 资源的托管标识 | 应用程序在已使用托管标识配置的 Azure 资源上运行。 若要了解详细信息,请参阅 Azure 资源的托管标识。 |
设备令牌 | 你的应用程序应仅以交互方式使用。 用户可能已启用多重身份验证。 用户可以访问用于登录的 Web 浏览器。 有关详细信息,请参阅使用设备令牌身份验证。 |
用户名/密码 | 某个交互式应用程序无法使用其他任何身份验证方法。 你的用户没有为其 Microsoft Entra 登录启用多重身份验证。 |
要点
- 如果使用客户端凭据以外的身份验证类型,则必须在 Microsoft Entra ID 中注册应用程序。 若要了解如何操作,请参阅 将应用程序与 Microsoft Entra ID 集成。
- 除非有特殊要求,否则请避免使用用户名/密码身份验证。 在适合基于用户的登录的情况下,通常可以使用设备令牌身份验证。
可通过不同的方法使用这些身份验证类型。
- 基于环境的身份验证直接从程序的环境读取凭据。
- 基于文件的身份验证加载包含服务主体凭据的文件。
- 基于客户端的身份验证使用代码中的对象,使你负责在程序执行期间提供凭据。
- 设备令牌身份验证要求用户以交互方式通过 Web 浏览器使用令牌登录。
github.com/Azure/go-autorest/autorest/azure/auth 包中提供了所有身份验证函数和类型。
注意
除非有特殊要求,否则请避免使用基于客户端的身份验证。 这种身份验证方法很容易引起错误的做法。 具体而言,使用基于客户端的身份验证容易导致凭据硬编码。 此外,如果身份验证要求发生变化,可能无法使用将来的 SDK 版本编写身份验证的自定义代码。
使用基于环境的身份验证
如果在受控设置中运行应用程序,则基于环境的身份验证是一种自然选择。 使用此身份验证方法,可以在运行应用程序之前配置 shell 环境。 在运行时,Go SDK 读取这些环境变量,以使用 Azure 进行身份验证。
基于环境的身份验证支持除设备令牌之外的所有身份验证类型,按以下顺序进行评估:
- 客户端凭据
- 基于证书的身份验证
- 用户名/密码
- Azure 资源的托管标识
如果身份验证类型具有未设置值或被拒绝,则该 SDK 会自动尝试下一种身份验证类型。 当没有更多类型可供尝试时,SDK 会返回错误。
下表详细描述了需要为基于环境的身份验证支持的每种身份验证类型设置的环境变量。
Authentication type | 环境变量 | 说明 |
---|---|---|
客户端凭据 | AZURE_TENANT_ID |
服务主体所属的 Active Directory 租户的 ID。 |
AZURE_CLIENT_ID |
服务主体的名称或 ID。 | |
AZURE_CLIENT_SECRET |
与服务主体关联的机密。 | |
Certificate | AZURE_TENANT_ID |
证书注册到的 Active Directory 租户的 ID。 |
AZURE_CLIENT_ID |
与证书关联的应用程序客户端 ID。 | |
AZURE_CERTIFICATE_PATH |
客户端证书文件的路径。 | |
AZURE_CERTIFICATE_PASSWORD |
客户端证书的密码。 | |
用户名/密码 | AZURE_TENANT_ID |
用户所属的 Active Directory 租户的 ID。 |
AZURE_CLIENT_ID |
应用程序客户端 ID。 | |
AZURE_USERNAME |
用于登录的用户名。 | |
AZURE_PASSWORD |
用于登录的密码。 | |
托管的标识 | 托管标识身份验证不需要凭据。 应用程序必须在配置为使用托管标识的资源上运行。 有关详细信息,请参阅 Azure 资源的托管标识。 |
若要连接到默认 Azure 公有云以外的云或管理终结点,请设置以下环境变量。 最常见的原因是要使用 Azure Stack、不同地理区域中的云,或经典部署模型。
环境变量 | 说明 |
---|---|
AZURE_ENVIRONMENT |
要连接到的云环境的名称。 |
AZURE_AD_RESOURCE |
连接时要使用的 Active Directory 资源 ID,作为管理终结点的 URI。 |
使用基于环境的身份验证时,请调用 NewAuthorizerFromEnvironment 函数来获取授权者对象。 然后,在客户端的 Authorizer
属性中设置此对象,以允许客户端访问 Azure。
import "github.com/Azure/go-autorest/autorest/azure/auth"
authorizer, err := auth.NewAuthorizerFromEnvironment()
Azure Stack 上的身份验证
若要在 Azure Stack 上进行身份验证,需要设置以下变量:
环境变量 | 说明 |
---|---|
AZURE_AD_ENDPOINT |
Active Directory 终结点。 |
AZURE_AD_RESOURCE |
Active Directory 资源 ID。 |
可以从 Azure Stack 元数据信息中检索这些变量。 若要检索元数据,请在 Azure Stack 环境中打开 Web 浏览器并使用 url:(ResourceManagerURL)/metadata/endpoints?api-version=1.0
ResourceManagerURL
因 Azure Stack 部署的区域名称、计算机名称和外部完全限定的域名 (FQDN) 而异:
环境 | ResourceManagerURL |
---|---|
开发工具包 | https://management.local.azurestack.external/ |
集成系统 | https://management.(region).ext-(machine-name).(FQDN) |
有关如何在 Azure Stack 上使用 Azure SDK for Go 的详细信息,请参阅在 Azure Stack 中将 API 版本配置文件与 Go 配合使用
使用基于文件的身份验证
基于文件的身份验证使用由 Azure CLI 生成的文件格式。 在创建新服务主体时,可以使用 --sdk-auth
参数轻松创建此文件。 如果打算使用基于文件的身份验证,请确保在创建服务主体时提供此参数。 由于 CLI 在 stdout
中列显输出,因此会将输出重定向到某个文件。
az ad sp create-for-rbac --role Contributor \
--scopes /subscriptions/<subscription_id> \
--sdk-auth > azure.auth
将 AZURE_AUTH_LOCATION
环境变量设置为授权文件所在的位置。 应用程序会读取此环境变量,并且会分析其中包含的凭据。 如果需要在运行时选择授权文件,请使用 os.Setenv 函数来操作程序的环境。
若要加载身份验证信息,请调用 NewAuthorizerFromFile 函数。 与基于环境的授权不同,基于文件的授权需要一个资源终结点。
import "github.com/Azure/go-autorest/autorest/azure/auth"
authorizer, err := NewAuthorizerFromFile(azure.PublicCloud.ResourceManagerEndpoint)
有关使用服务主体和管理其访问权限的详细信息,请参阅使用 Azure CLI 创建服务主体。
使用设备令牌身份验证
如果希望用户以交互方式登录,最好是通过设备令牌身份验证提供该功能。 此身份验证流将用户传递一个令牌以粘贴到 Microsoft 登录站点中,然后通过 Microsoft Entra 帐户进行身份验证。 此身份验证方法支持启用了多重身份验证的帐户,与标准用户名/密码身份验证不同。
若要使用设备令牌身份验证,请使用 NewDeviceFlowConfig 函数创建一个 DeviceFlowConfig 授权者。 针对生成的对象调用 Authorizer 以启动身份验证过程。 在整个身份验证流完成之前,设备流身份验证会一直阻止程序的执行。
import "github.com/Azure/go-autorest/autorest/azure/auth"
deviceConfig := auth.NewDeviceFlowConfig(applicationID, tenantID)
authorizer, err := deviceConfig.Authorizer()
使用身份验证客户端
如果需要特定的身份验证类型,并且愿意让程序执行相应的操作以从用户加载身份验证信息,则可以使用任何符合 auth.AuthorizerConfig 接口的客户端。 在以下情况下使用实现此接口的类型:
- 编写交互式程序
- 使用专用的配置文件
- 有阻止使用内置身份验证方法的要求
警告
切勿在应用程序中对 Azure 凭据进行硬编码。 将机密放入应用程序二进制文件会使攻击者更容易提取这些机密,不管应用程序是否正在运行。 这会将凭据授权的所有 Azure 资源置于风险之中!
下表列出了 SDK 中符合 AuthorizerConfig
接口的类型。
Authentication type | 授权者类型 |
---|---|
基于证书的身份验证 | ClientCertificateConfig |
客户端凭据 | ClientCredentialsConfig |
Azure 资源的托管标识 | MSIConfig |
用户名/密码 | UsernamePasswordConfig |
使用关联的 New
函数创建一个验证器,然后针对生成的对象调用 Authorize
进行身份验证。 例如,若要使用基于证书的身份验证,请执行以下调用:
import "github.com/Azure/go-autorest/autorest/azure/auth"
certificateAuthorizer := auth.NewClientCertificateConfig(certificatePath, certificatePassword, clientID, tenantID)
authorizerToken, err := certificateAuthorizer.Authorizer()