Azure ML脚本DeviceCodeCredentials缓存失效问题求助
解决方案:修复Azure ML DeviceCodeCredential凭据缓存失效问题
核心问题分析
你遇到的缓存失效问题,主要是对TokenCachePersistenceOptions的name参数用法理解错误,加上缺少显式租户ID指定导致的。以下是具体修复步骤:
1. 修正TokenCachePersistenceOptions配置
name参数不是文件路径,而是缓存的唯一标识,SDK会自动在~/.azure目录下生成对应缓存文件(格式为msal_token_cache-{name}.json)。之前传入完整路径会导致SDK无法正确识别和加载缓存。
2. 显式指定租户ID
默认情况下DeviceCodeCredential可能会自动解析租户,但这容易导致缓存令牌与后续请求的租户不匹配,必须显式指定tenant_id确保一致性。
3. 确保缓存文件权限
Linux环境下,~/.azure目录需设置为当前用户可读写(权限建议700),避免因权限不足无法写入/读取缓存。
修改后的完整代码
import os from azure.ai.ml import MLClient from azure.identity import DeviceCodeCredential, TokenCachePersistenceOptions from .constants import AML_SUBSCRIPTION_ID, AML_RESOURCE_GROUP, AML_WORKSPACE, AML_TENANT_ID # 新增租户ID常量 # 仅指定缓存名称,SDK自动处理路径 cache_name = "azure_ml_pipeline_cache" token_cache_options = TokenCachePersistenceOptions( name=cache_name, allow_unencrypted_storage=True # 无GUI环境必须开启,避免依赖密钥环 ) # 显式传入租户ID,避免租户解析不一致 credential = DeviceCodeCredential( tenant_id=AML_TENANT_ID, token_cache_persistence_options=token_cache_options ) client = MLClient( credential=credential, subscription_id=AML_SUBSCRIPTION_ID, resource_group_name=AML_RESOURCE_GROUP, workspace_name=AML_WORKSPACE, ) # 触发认证(缓存有效时自动复用) jobs = client.jobs.list() _ = [j.name for j in jobs]
额外排查步骤
- 清理无效缓存:删除
~/.azure目录下旧的缓存文件(比如你之前生成的msal_token_cache.json),重新运行脚本生成新的有效缓存。 - 升级SDK版本:旧版本可能存在缓存逻辑bug,执行
pip install --upgrade azure-identity azure-ai-ml更新到最新稳定版。 - 验证缓存加载:可以在代码中添加日志,检查令牌是否从缓存获取:
from azure.core.credentials import AccessToken token = credential.get_token("https://ml.azure.com/.default") print(f"Token acquired from cache: {token.expires_on > time.time()}")
内容的提问来源于stack exchange,提问作者stuart
相关产品推荐
相关产品推荐

