You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python SDK的ChainedTokenCredential中集成Azure存储账户共享访问密钥?

解决方案:托管标识与共享密钥的链式认证实现

ChainedTokenCredential 仅支持组合实现了 TokenCredential 接口的凭据类型,而共享访问密钥(或 SharedKeyCredential)并不属于此类,因此无法直接将其纳入链式凭据。要实现「先尝试托管标识认证,失败则切换到共享密钥」的需求,可以通过以下两种方式实现:

方案一:手动实现链式认证逻辑

直接通过异常捕获处理认证失败的情况,先尝试托管标识,失败后自动切换到共享密钥:

from azure.identity import ManagedIdentityCredential
from azure.storage.filedatalake import DataLakeServiceClient
from azure.core.exceptions import ClientAuthenticationError

# 替换为你的存储账户信息
account_url = "https://<your-storage-account>.dfs.core.windows.net"
account_key = "<your-account-key>"

service_client = None
try:
    # 尝试托管标识认证
    mi_cred = ManagedIdentityCredential()
    service_client = DataLakeServiceClient(account_url, credential=mi_cred)
    # 执行轻量操作验证认证有效性
    service_client.get_service_properties()
except ClientAuthenticationError:
    # 托管标识认证失败,切换为共享密钥
    service_client = DataLakeServiceClient(account_url, credential=account_key)

# 后续使用 service_client 进行数据湖操作

方案二:自定义 TokenCredential 封装共享密钥(不推荐)

如果一定要通过 ChainedTokenCredential 形式实现,可以自定义一个继承自 TokenCredential 的类,在 get_token 方法中抛出异常(让链式凭据跳过它),然后结合自定义逻辑处理。不过这种方式本质上还是手动切换,且不符合凭据设计的初衷,仅作参考:

from azure.identity import ManagedIdentityCredential, ChainedTokenCredential, TokenCredential
from azure.storage.filedatalake import DataLakeServiceClient
from azure.core.exceptions import ClientAuthenticationError
from azure.core.credentials import AccessToken
import datetime

class SharedKeyAsTokenCredential(TokenCredential):
    def __init__(self, account_key):
        self.account_key = account_key
    
    def get_token(self, *scopes, **kwargs):
        # 抛出异常,让 ChainedTokenCredential 尝试下一个凭据
        raise ClientAuthenticationError("Shared key requires direct use, not token-based auth")

# 构建链式凭据
cred_chain = ChainedTokenCredential(
    ManagedIdentityCredential(),
    SharedKeyAsTokenCredential(account_key)
)

service_client = None
try:
    service_client = DataLakeServiceClient(account_url, credential=cred_chain)
    service_client.get_service_properties()
except ClientAuthenticationError:
    # 链式凭据失败,直接使用共享密钥
    service_client = DataLakeServiceClient(account_url, credential=account_key)

关键说明

  • ChainedTokenCredential 的设计目标是组合多种**基于令牌(Token)**的认证方式,共享密钥属于基于签名的认证,两者机制不同,因此无法直接兼容。
  • 方案一是更简洁、符合SDK设计的实现方式,优先推荐使用。

内容的提问来源于stack exchange,提问作者Tomi Illes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:47:28