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

禁用存储账户密钥访问后,Azure Function触发器无法访问存储账户

问题解决:Azure Function禁用存储账户密钥访问后触发403错误

问题根源

你遇到的KeyBasedAuthenticationNotPermitted错误并非来自用户代码,而是Azure Functions宿主环境在尝试使用密钥访问AzureWebJobsStorage存储账户时失败——宿主需要该存储账户来管理触发器租约、运行时日志、作业队列等内部操作,而你已禁用密钥访问,因此必须配置宿主通过托管标识访问存储账户。

解决方案

1. 调整AzureWebJobsStorage连接字符串

将Function App配置中的AzureWebJobsStorage值替换为基于托管标识的连接格式,不再使用包含密钥的传统连接字符串:

DefaultEndpointsProtocol=https;AccountName=<你的存储账户名>;EndpointSuffix=core.windows.net;Authentication=ManagedIdentity

替换<你的存储账户名>为实际的存储账户名称。

2. 确认托管标识权限(补充必要权限)

除了你已分配的Storage Blob Data Contributor和Storage Queue Data Contributor,确保托管标识对存储账户的azure-webjobs-hosts容器有读写权限——宿主依赖该容器管理触发器的租约。若使用的是系统分配托管标识,直接在存储账户的IAM中确认权限已生效;若为用户分配标识,需确保Function App已关联该标识。

3. 修正代码中的队列访问逻辑

你的代码中send_message_to_queue函数未实现,需使用托管标识而非密钥初始化QueueServiceClient:

def send_message_to_queue(queue_name: str, message: str):
    credential = DefaultAzureCredential()
    # 替换为你的存储账户名
    account_url = "https://<你的存储账户名>.queue.core.windows.net"
    queue_service_client = QueueServiceClient(account_url=account_url, credential=credential)
    queue_client = queue_service_client.get_queue_client(queue_name)
    queue_client.send_message(message)

4. 重启Function App

保存所有配置修改后,重启Function App确保配置生效。

验证

触发Blob或调用HTTP触发器后,检查Function App日志:若不再出现403错误,且存储账户的诊断日志显示请求来自托管标识,则配置成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:53:22