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的主要内容,如果未能解决你的问题,请参考以下文章

Blob 存储帐户的 Azure SAS 令牌不起作用

在 Java 中生成 SAS 令牌以下载 Azure 数据存储容器中的文件

在不使用主键或辅助键的情况下使用 azure 存储帐户进行身份验证

使用 PowerShell 生成 Azure 存储帐户 SAS 密钥

有没有办法重新生成 Azure Blob 存储 SAS 令牌

Azure CDN URL使用令牌身份验证和Blob存储SAS重写规则