如何在Azure ML管道中认证避免浏览器交互式身份验证
问题根因
- 你虽然实例化了服务主体凭据对象,但没有将该对象传入任何Azure ML SDK的认证参数,凭据完全没被使用。代码中直接调用无参
Workspace.from_config()时,SDK会按优先级读取本地交互式登录缓存、Azure CLI认证缓存完成鉴权;管道运行在远端Linux计算节点时,节点上不存在这些本地缓存文件,SDK会自动回退到设备码交互式认证流程,就出现了你看到的需要浏览器打开登录页的提示。 - 认证类选型不匹配:
azure.identity.ClientSecretCredential是新一代Azure通用SDK的认证类,不兼容你当前使用的Azure ML v1(azureml.core)SDK;v1 SDK需要用原生的azureml.core.authentication.ServicePrincipalAuthentication类完成服务主体认证。 - 逻辑顺序错误:你调用
ws.get_default_keyvault()读取密钥的逻辑,依赖Workspace连接成功后才能执行,但计算节点上第一步连接Workspace时就会触发认证,此时还没拿到Key Vault里的凭据,必然会走默认认证流程。
修复方案
1. 本地提交管道阶段的认证配置
本地提交管道连接Workspace时,显式传入服务主体认证对象,不要使用无参的from_config()隐式鉴权:
import os import json from azureml.core import Workspace from azureml.core.authentication import ServicePrincipalAuthentication # 读取config.json中存储的工作区基础信息(订阅ID、资源组、工作区名) config_path = os.path.join(os.getcwd(), "config.json") with open(config_path, "r", encoding="utf-8") as f: ws_config = json.load(f) # 初始化v1 SDK原生支持的服务主体认证 sp_auth = ServicePrincipalAuthentication( tenant_id="<你的Azure AD租户ID>", service_principal_id="<服务主体客户端ID>", service_principal_password="<服务主体客户端密钥>" ) # 显式传入auth参数连接工作区,跳过默认认证流程 ws = Workspace( subscription_id=ws_config["subscription_id"], resource_group=ws_config["resource_group"], workspace_name=ws_config["workspace_name"], auth=sp_auth )
2. 远端计算节点运行管道步骤的认证配置
你日志里的报错路径是/root/.azureml/auth/,说明认证触发在远端计算节点运行脚本的阶段,这里有两种可选配置:
方案A:服务主体认证
把服务主体的三个凭据参数通过管道的环境变量、PipelineParameter注入到步骤运行环境中,在远端执行的脚本里同样显式传入sp_auth初始化Workspace,不要调用无参Workspace.from_config()。
方案B:计算集群托管标识认证(推荐)
给运行管道的AmlCompute集群启用系统分配托管标识,给该标识分配AML工作区的最小必要权限(如贡献者角色),远端脚本直接用托管标识认证,不需要管理客户端密钥,完全避免交互式认证:
from azureml.core import Workspace from azureml.core.authentication import MsiAuthentication # 计算集群内运行时会自动获取托管标识令牌,不需要手动传密钥 msi_auth = MsiAuthentication() ws = Workspace( subscription_id="<你的订阅ID>", resource_group="<资源组名>", workspace_name="<AML工作区名>", auth=msi_auth )
注意事项
- 不要在Azure ML v1 SDK中使用
ClientSecretCredential作为Workspace连接的认证参数,v1 SDK无法识别该类,传入后不会生效。 - 提前给使用的服务主体/托管标识分配对应AML工作区的操作权限,避免认证通过后出现权限拒绝错误。
- 如果需要使用
from_config()方法,必须在连接Workspace前将包含认证信息的配置文件写入节点对应路径,相比显式传参可维护性更低,不推荐使用。
内容的提问来源于stack exchange,提问作者E.Brum
相关产品推荐
相关产品推荐

