如何无需专用工具,通过HTTP结合Azure AD认证下载Azure Blob
针对你的需求,有两种无需AzCopy等专用工具、基于现有Azure AD权限体系的可行方案,以下是具体实现方式:
方案一:使用Azure AD OAuth2访问令牌(推荐)
这种方式直接复用你已配置的Azure AD用户/组权限,无需生成SAS,步骤简洁,完全通过HTTP请求实现:
1. 获取Azure AD访问令牌
使用curl请求Azure AD令牌端点,替换占位符为你的实际信息:
curl -X POST "https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id={客户端ID}&scope=https://storage.azure.com/.default&grant_type=password&username={用户邮箱}&password={用户密码}"
注:若使用服务主体,可切换为客户端凭证流(
grant_type=client_credentials,添加client_secret参数);交互式用户可采用设备码流,避免明文输入密码。
从返回结果中提取access_token字段。
2. 使用令牌下载Blob
拿到令牌后,用curl或wget发起请求,将令牌放入Authorization请求头:
curl示例:
curl -H "Authorization: Bearer {获取到的access_token}" \ "https://{存储账户名}.blob.core.windows.net/{容器名}/{Blob路径}" \ -o {本地保存文件名}
wget示例:
wget --header="Authorization: Bearer {获取到的access_token}" \ -O {本地保存文件名} \ "https://{存储账户名}.blob.core.windows.net/{容器名}/{Blob路径}"
该方式会自动验证用户/组对目标容器的权限,完全匹配你现有的Azure AD权限配置。
方案二:用户委托SAS(User Delegation SAS)
如果你偏好SAS方式,用户委托SAS确实可行——它基于Azure AD身份生成,权限受限于生成者的Azure AD权限,无需存储账户密钥:
1. 获取用户委托密钥
先通过Azure AD令牌获取有效期最长7天的用户委托密钥:
curl -X POST "https://{存储账户名}.blob.core.windows.net/?restype=service&comp=userdelegationkey" \ -H "Authorization: Bearer {Azure AD访问令牌}" \ -H "x-ms-version: 2020-04-08" \ -H "Content-Type: application/json" \ -d '{ "Start": "2024-05-20T00:00:00Z", "Expiry": "2024-05-27T00:00:00Z" }'
从返回结果中提取UserDelegationKey相关字段:SignedOid、SignedTid、SignedStart、SignedExpiry、SignedKey。
2. 生成SAS签名并访问
使用上述密钥进行HMAC-SHA256签名计算(可通过Python脚本或bash结合openssl实现),构造出带SAS参数的Blob URL后,直接用curl/wget访问即可。
注:此方式需手动处理签名逻辑,步骤比OAuth2令牌方案繁琐,适合需要生成临时共享访问链接的场景。
总结
- 优先推荐Azure AD OAuth2访问令牌方案:无需额外资源,复用现有Azure AD权限,操作更简单。
- 用户委托SAS适合临时共享场景,但需额外处理签名计算。
内容的提问来源于stack exchange,提问作者clbx

