Azure Machine Learning 工作区身份验证机制详解
前言
在 Azure Machine Learning 服务中,身份验证是访问和管理工作区的第一步。本文将全面解析 Azure ML 提供的五种身份验证方式,帮助开发者根据不同的使用场景选择最合适的认证方案。
身份验证方式概览
Azure ML 提供了五种主要的身份验证方式:
- 交互式登录认证 - 适合本地开发和实验
- Azure CLI 认证 - 适合已使用 Azure CLI 的用户
- 托管服务身份(MSI)认证 - 适合 Azure 虚拟机上的自动化流程
- 服务主体认证 - 适合自动化工作流和 CI/CD 场景
- 令牌认证 - 提供更细粒度的令牌控制
1. 交互式登录认证
交互式认证是 Azure ML SDK 的默认认证方式,适合个人开发者在本地计算机上进行实验。
基本用法
from azureml.core import Workspace
# 从配置文件获取工作区
ws = Workspace.from_config()
# 或直接指定参数
ws = Workspace(subscription_id="订阅ID",
resource_group="资源组名称",
workspace_name="工作区名称")
常见问题解决
问题1:访问权限错误
错误信息示例:
AuthenticationException: You don't have access to xxxx subscription...
解决方案:
- 确认登录账户正确
- 检查订阅ID是否输入正确
- 确保账户有访问该订阅和资源组的权限
问题2:租户相关问题
错误信息示例:
All the subscriptions that you have access to = []
解决方案:明确指定租户ID
from azureml.core.authentication import InteractiveLoginAuthentication
interactive_auth = InteractiveLoginAuthentication(tenant_id="租户ID")
ws = Workspace(subscription_id="订阅ID",
resource_group="资源组",
workspace_name="工作区名称",
auth=interactive_auth)
问题3:权限更新不及时
当您刚被授予访问权限但认证失败时,可以强制刷新认证:
forced_interactive_auth = InteractiveLoginAuthentication(tenant_id="租户ID", force=True)
ws = Workspace(subscription_id="订阅ID",
resource_group="资源组",
workspace_name="工作区名称",
auth=forced_interactive_auth)
2. Azure CLI 认证
如果您已经使用 Azure CLI 管理 Azure 资源,可以使用 CLI 认证方式避免重复登录。
使用方法
from azureml.core.authentication import AzureCliAuthentication
cli_auth = AzureCliAuthentication()
ws = Workspace(subscription_id="订阅ID",
resource_group="资源组",
workspace_name="工作区名称",
auth=cli_auth)
注意:交互式认证不会自动使用已有的 Azure CLI 认证令牌。
3. 托管服务身份(MSI)认证
MSI 认证适用于 Azure 虚拟机上的自动化流程,无需在代码中存储凭据。
前提条件
- 为 VM 启用系统分配的托管身份
- 授予 VM 对工作区的访问权限
使用方法
from azureml.core.authentication import MsiAuthentication
msi_auth = MsiAuthentication()
ws = Workspace(subscription_id="订阅ID",
resource_group="资源组",
workspace_name="工作区名称",
auth=msi_auth)
重要:MSI 认证只能在 Azure 虚拟机上使用,本地计算机会失败。
4. 服务主体认证
服务主体认证是自动化工作流(如 Azure DevOps 构建)的推荐方式。
创建服务主体步骤
- 在 Azure 门户中创建应用注册
- 记录应用程序ID和租户ID
- 创建客户端密钥
- 授予服务主体对工作区的访问权限
使用方法
import os
from azureml.core.authentication import ServicePrincipalAuthentication
# 从环境变量获取密码(推荐)
svc_pr_password = os.environ.get("AZUREML_PASSWORD")
svc_pr = ServicePrincipalAuthentication(
tenant_id="租户ID",
service_principal_id="应用程序ID",
service_principal_password=svc_pr_password)
ws = Workspace(
subscription_id="订阅ID",
resource_group="资源组",
workspace_name="工作区名称",
auth=svc_pr)
安全建议:永远不要在代码中硬编码密码,使用环境变量或Azure Key Vault存储密码。
5. 令牌认证
令牌认证提供了更细粒度的控制,适用于需要在 AML SDK 外部管理令牌生成和刷新的场景。
使用方法
from azureml.core.authentication import TokenAuthentication, Audience
def get_token_for_audience(audience):
# 实现获取令牌的逻辑
return token
token_auth = TokenAuthentication(get_token_for_audience=get_token_for_audience)
ws = Workspace(
subscription_id="订阅ID",
resource_group="资源组",
workspace_name="工作区名称",
auth=token_auth)
# 获取AML和ARM令牌
token_aml = token_auth.get_token(Audience.aml)
token_arm = token_auth.get_token(Audience.arm)
远程运行中的密钥管理
在远程运行中使用密钥(如数据库密码)时,可以通过工作区关联的Key Vault安全传递。
设置密钥
import os
import uuid
local_secret = os.environ.get("LOCAL_SECRET", default=str(uuid.uuid4()))
keyvault = ws.get_default_keyvault()
keyvault.set_secret(name="密钥名称", value=local_secret)
注意:azureml.core.keyvault.Keyvault
是专门为工作区密钥设计的简化包装器,不同于通用的azure.keyvault
库。
总结
选择哪种认证方式取决于您的使用场景:
- 个人开发:交互式认证或Azure CLI认证
- 自动化流程:服务主体认证或MSI认证
- 高级令牌控制:令牌认证
- 密钥管理:使用工作区的Key Vault
理解这些认证机制将帮助您构建更安全、更高效的Azure ML工作流。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考