0

我正在尝试实现一个功能,该功能使用 URL 上的 SAS 令牌从 blob 存储中提取数据。我遇到的一个问题是,我在天蓝色的基础设施中有服务器端加密,因此我们上传到 blob 容器位置的文件会被加密。

我们用于下载这些文件的当前实现当前不使用 SAS 令牌,我只是简单地调用DownloadTextAsync()blob 块引用。这一切都很好,并且会生成一个在下载时未加密的文件,但这会带来性能损失,因为文件取决于大小可能需要相当长的时间才能完成下载,并且在我的前端可能会导致不友好的用户经验。

我可以实现生成 SAS 令牌并将其附加到引用给定 blob 的 uri,但是在单击此链接或将其粘贴到 Web 浏览器时,下载的文件仍然是加密的。我已经尝试添加SharedAccessBlobHeadersGetSharedAccessSignature调用以及指定ContentDispostion,ContentType并且ContentEncoding似乎没有下载未加密的文件。

我是否遗漏了什么,有没有办法让 SAS 令牌说解密文件或者这不可能?

编辑:

添加了一些我在 blob 商店周围所做的代码片段。

  
  //Method in a Factory Implementation
  public async Task<IBlobStore> CreateBlobStoreAsync(string containerName)
  {
    var storageAccount = AzureStorageCommon.Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(_configuration.AzureStorageConnectionString);
    var cloudBlobClient = new AzureStorageBlob.Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient(storageAccount.BlobStorageUri, storageAccount.Credentials, null);

      var keyVaultKeyResolver = new KeyVaultKeyResolver((KeyVaultClient) _keyVaultClient);
      var keyBundle = await _keyVaultClient.GetKeyAsync(_configuration.KeyVaultUri, _configuration.EncryptionKeyName);

      var key = await keyVaultKeyResolver.ResolveKeyAsync(keyBundle.KeyIdentifier.Identifier, CancellationToken.None);
      var policy = new AzureStorageBlob.Microsoft.WindowsAzure.Storage.Blob.BlobEncryptionPolicy(key, keyVaultKeyResolver);
      cloudBlobClient.DefaultRequestOptions.EncryptionPolicy = policy;

    var container = cloudBlobClient.GetContainerReference(containerName);
    var blobStore = new AzureBlobStore(container, _logger);
    return blobStore;
  }


public async Task<string> GetImportJobSasUrl(string store, string name)
{
    var blobStore = await _blobStoreFactory.CreateBlobStoreAsync(store); //Method above
    var exists = await blobStore.ExistsAsync(name);
    if (!exists)
        return null;

    var fileSasUri = await blobStore.GetSasTokenUrlAsync(name);

    return fileSasUri;
} 


public async Task<string> GetSasTokenUrlAsync(string name)
{
    string sasUrl;
    try
    {
        await _container.CreateIfNotExistsAsync();
        var blob = _container.GetBlockBlobReference(name);
        var currentTime = DateTime.UtcNow;

        var policy = new AzureStorageBlob.Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy
        {
            SharedAccessStartTime = currentTime,
            SharedAccessExpiryTime = currentTime.AddHours(1),
            Permissions = AzureStorageBlob.Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Read,
        };

        var sasToken = blob.GetSharedAccessSignature(policy, headers);
        sasUrl = $"{blob.Uri}{sasToken}";
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, $"Error getting SAS token URL from Azure Blob Storage. Name: {name}");
        throw;
    }
    return sasUrl;
}
4

0 回答 0