本地Azure Function已登录仍无法获取令牌,无法读取Blob存储
解决本地Azure函数使用DefaultAzureCredential访问Blob存储的认证问题
问题分析
你遇到的DefaultAzureCredential认证失败,核心原因是本地函数进程无法通过AzureCliCredential获取已登录的Azure CLI会话信息,导致所有内置认证方式均失效。以下是针对性的修复步骤:
修复步骤
1. 确保函数进程继承Azure CLI会话
本地运行Azure函数时,VS Code的运行按钮可能无法继承终端的CLI会话,需按以下操作:
- 关闭当前VS Code终端,重新打开一个新终端
- 在新终端中执行
az login,确认登录账户为已分配Storage Account Contributor角色的账户 - 直接在该终端中用
func start命令启动函数,而非通过VS Code的运行按钮
2. 显式指定AzureCliCredential替代DefaultAzureCredential
修改代码,直接使用AzureCliCredential避免自动认证链的不确定性:
import azure.functions as func from azure.storage.blob import BlobServiceClient from azure.identity import AzureCliCredential def main(req=None) -> func.HttpResponse: account_url = "https://<name>.blob.core.windows.net" # 直接使用Azure CLI登录的凭证 credential = AzureCliCredential() blob_service_client = BlobServiceClient(account_url, credential=credential) container_client = blob_service_client.get_container_client('<name>') blob_list = container_client.list_blobs() # 返回所有Blob名称,而非仅第一个 blob_names = "\n".join([b.name for b in blob_list]) return func.HttpResponse(f'容器中的Blob列表:\n{blob_names}')
3. 验证并切换到正确的Azure订阅
在终端执行以下命令,确认当前登录账户的订阅信息:
az account show
如果输出的订阅不是目标存储账户所在的订阅,执行切换命令:
az account set --subscription <目标订阅ID>
4. 确认VS Code Azure扩展已登录正确账户
打开VS Code左侧的Azure面板,确认顶部显示的账户与终端az login的账户一致,避免扩展与终端账户不一致导致的会话隔离问题。
内容的提问来源于stack exchange,提问作者Brian Barry
相关产品推荐
相关产品推荐

