【发布时间】:2014-02-13 14:54:16
【问题描述】:
我正在使用 Azure blob 存储来存储来自客户端的数据。
客户端被授予共享访问签名,没有“删除”权限。
不过,我可以使用以下代码在没有“删除”权限的情况下删除 blob 内容:
// sharedKey doesn't contain 'Delete' permission
var credentials = new StorageCredentials(sharedKey);
var blob = new CloudBlockBlob(blobPath, credentials);
var blockIds = new List<string>();
// If not getting all current blocks ids, all current data will be lost.
// if (blob.Exists())
// {
// blockIds.AddRange(blob.DownloadBlockList().Select(b => b.Name));
// }
var blockId =
Convert.ToBase64String(
Encoding.Default.GetBytes(blockIds.Count.ToString("d6", CultureInfo.InvariantCulture)));
blockIds.Add(blockId);
byte[] eventInBytes = Encoding.Default.GetBytes(string.Format(CultureInfo.InvariantCulture, "{0}\n", formattedEvent));
using (var eventStream = new MemoryStream(eventInBytes))
{
blob.PutBlock(blockId, eventStream, null);
}
blob.PutBlockList(blockIds);
这是 Azure 缺陷吗(或者我错过了共享访问签名的概念?有什么办法可以克服这个问题?
谢谢!
【问题讨论】:
-
如果我没记错的话,你并没有真正删除 blob。如果您在共享访问签名中包含写入权限,您只是覆盖了 blob。
-
true,但您必须同意通过上传空字符串覆盖 blob 与删除 blob 相同(我的意思是,您不删除文件本身,而是删除空 blob等于根本没有 blob 文件)
-
我不这么认为。虽然我同意你的 blob 对你没有用,但我不符合被删除的资格。如果用户上传一些垃圾数据而不是空字符串怎么办?你还会考虑删除 blob 吗?
-
这取决于旧数据是否已被删除。只要保留现有数据,用户就可以上传他想要的任何数据。
-
您的客户是只给了 SAS 并且他们编写了代码(如上)还是您编写了这段代码?如果是后者,您可以在上传之前拍摄 Blob 的快照,以便您拥有 Blob 的最后一个工作副本。