Django应用上传文件至Azure Blob Storage时遇错误求助
问题分析与解决方案
一、核心错误根源:非HTTPS URL的Bearer Token认证限制
错误提示Bearer token authentication is not permitted for non-TLS protected (non-https) URLs,说明你配置的Azure服务URL使用了HTTP协议,但Azure Key Vault和Blob Storage强制要求通过HTTPS访问。
修复步骤:
- 检查
.env文件中的AZURE_VAULT_ACCOUNT和AZURE_STORAGE_ACCOUNT值,确保是完整HTTPS格式:- Key Vault URL示例:
https://your-vault-name.vault.azure.net/ - Blob存储账户URL示例:
https://your-storage-account.blob.core.windows.net/
- Key Vault URL示例:
- 更新后重启Django应用,重新测试上传功能。
二、Azure AD权限问题(账户所有者无访问权限)
即使是订阅所有者,也可能因Azure AD权限隔离无法访问相关资源,以下是两种解决路径:
1. 快速测试方案:绕过Key Vault直接使用存储密钥
适合开发阶段验证功能,跳过Key Vault环节:
- 在Azure门户的存储账户「访问密钥」页面,复制其中一个密钥值
- 在
.env中添加AZURE_STORAGE_KEY=<复制的密钥> - 修改
azure_controller.py的create_blob_client函数:
def create_blob_client(file_name): return BlobClient( account_url = settings.AZURE_STORAGE_ACCOUNT, container_name = settings.AZURE_APP_BLOB_NAME, blob_name = file_name, credential = settings.AZURE_STORAGE_KEY, )
2. 生产环境方案:解决Azure AD权限问题
(1)获取Azure AD全局权限
- 登录Azure门户,进入「Azure Active Directory」→「角色和管理员」
- 搜索「全局管理员」角色,确认你的账户是否在列表中;若不在,需联系现有全局管理员添加订阅所有者默认不自动拥有Azure AD全局权限。
(2)配置Key Vault访问策略
- 进入目标Key Vault,选择「访问策略」→「添加访问策略」
- 勾选需要的机密权限(如「获取」),选择你的账户作为主体,保存策略。
(3)推荐:使用托管身份(无需手动管理凭证)
若Django应用部署在Azure App Service:
- 在App Service的「身份」页面启用系统分配托管身份
- 在Key Vault访问策略中添加该身份,赋予机密读取权限
- 在Blob存储账户的「IAM」页面添加该身份,赋予「存储Blob数据贡献者」角色
- 修改
create_blob_client函数,直接用托管身份认证:
def create_blob_client(file_name): default_credential = DefaultAzureCredential() return BlobClient( account_url = settings.AZURE_STORAGE_ACCOUNT, container_name = settings.AZURE_APP_BLOB_NAME, blob_name = file_name, credential = default_credential, )
三、补充代码检查点
- 修改
check_file_ext函数,添加后缀小写转换,避免大小写匹配问题:def check_file_ext(path): ext = Path(path).suffix.lower() return ext in ALLOWED_EXTENSIONS - 确认Azure Blob容器
AZURE_APP_BLOB_NAME已创建,开发测试可设为「容器」访问级别,生产环境建议设为「私有」。
内容的提问来源于stack exchange,提问作者Marilyn Marquez
相关产品推荐
相关产品推荐

