Azure 存储帐户生成 SAS 令牌,而不是 SAS URI
Posted
技术标签:
【中文标题】Azure 存储帐户生成 SAS 令牌,而不是 SAS URI【英文标题】:Azure Storage Account generate SAS Token, not an SAS URI 【发布时间】:2021-10-02 11:26:12 【问题描述】:我正在使用Azure.Storage.Blob
库生成一个 SasToken,但我得到的是一个 Sas Uri。我在网上和docs 中查找了示例。
我尝试自己生成令牌,但没有成功。我什至尝试创建一个 SharedKeyLite,但也没有奏效。
我的 SharedKeyLite 代码:
var stringToSign = $"DateTimeOffset.UtcNow.ToString("R", CultureInfo.InvariantCulture)\n$canonicalizedResource";
var hmac = new HMACSHA256(Convert.FromBase64String(storageAccountKey));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
return Convert.ToBase64String(hash);
我的要求:
URI: https://<myAccount>.blob.core.windows.net/<pathToFile>
# Headers
Authorization: SharedKeyLite <myAccount>:<keyFromAbove>
x-ms-date: date
x-ms-version: 2014-02-14
错误:
服务器未能验证请求。确保 Authorization 标头的值格式正确,包括签名。
Azure.Storage.Blob
为什么不生成 SAS 令牌?
【问题讨论】:
【参考方案1】:使用 Azure CLI 从存储帐户获取 SAS 令牌。
az storage blob generate-sas \ --account-name Storage Account name \
--container-name container name \--name blob name \--permissions
permissions to grant \--expiry datetime to expire the SAS token \
--services storage services the SAS allows \--resource-types resource types the SAS allows
例子:
CONNECTION_STRING=<connection-string> az storage blob generate-sas \
--account-name MyStorageAccount \ --container-name MyContainer \
--name MyBlob \ --permissions racdw \ --expiry 2020-06-15
更多详情请参考link
另一种生成SAS Token的方法
private static string GetSharedAccessSignature(
string accountName,
string accountkey,
string blobContainer,
string blobName,
DateTimeOffset sharedAccessStartTime,
DateTimeOffset sharedAccessExpiryTime)
var canonicalNameFormat = $"/blob/accountName/blobContainer/blobName";
var st = sharedAccessStartTime.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
var se = sharedAccessExpiryTime.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
var sasVersion = "2016-05-31";
string stringToSign = string.Format("0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12", new object[]
"r",
st,
se,
canonicalNameFormat,
string.Empty,
string.Empty,
string.Empty,
sasVersion,
string.Empty,
string.Empty,
string.Empty,
string.Empty,
string.Empty
);
var sas = GetHash(stringToSign, accountkey);
var credentials =
$"?sv=sasVersion&sr=b&sig=UrlEncoder.Default.Encode(sas)&st=UrlEncoder.Default.Encode(st)&se=UrlEncoder.Default.Encode(se)&sp=r";
string blobUri = $"https://accountName.blob.core.windows.net/blobContainer/blobName";
return blobUri + credentials;
private static string GetHash(string stringToSign, string key)
byte[] keyValue = Convert.FromBase64String(key);
using (HMACSHA256 hmac = new HMACSHA256(keyValue))
return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
更多详情请参考thread
【讨论】:
以上是关于Azure 存储帐户生成 SAS 令牌,而不是 SAS URI的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中生成 SAS 令牌以下载 Azure 数据存储容器中的文件
在不使用主键或辅助键的情况下使用 azure 存储帐户进行身份验证
使用 PowerShell 生成 Azure 存储帐户 SAS 密钥