【问题标题】:Azure Storage Account generate SAS Token, not an SAS URIAzure 存储帐户生成 SAS 令牌,而不是 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 令牌?

【问题讨论】:

    标签: azure azure-storage azure-blob-storage azure-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}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n{8}\n{9}\n{10}\n{11}\n{12}", 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

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 2020-05-29
      • 2021-11-20
      • 2021-09-02
      • 2021-05-12
      • 1970-01-01
      • 2019-12-05
      • 2017-04-08
      • 2021-11-08
      相关资源
      最近更新 更多