我正在尝试实现一个功能,该功能使用 URL 上的 SAS 令牌从 blob 存储中提取数据。我遇到的一个问题是,我在天蓝色的基础设施中有服务器端加密,因此我们上传到 blob 容器位置的文件会被加密。
我们用于下载这些文件的当前实现当前不使用 SAS 令牌,我只是简单地调用DownloadTextAsync()
blob 块引用。这一切都很好,并且会生成一个在下载时未加密的文件,但这会带来性能损失,因为文件取决于大小可能需要相当长的时间才能完成下载,并且在我的前端可能会导致不友好的用户经验。
我可以实现生成 SAS 令牌并将其附加到引用给定 blob 的 uri,但是在单击此链接或将其粘贴到 Web 浏览器时,下载的文件仍然是加密的。我已经尝试添加SharedAccessBlobHeaders
到GetSharedAccessSignature
调用以及指定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;
}