【IT168微软云计算博客征文活动专稿】本文将介绍如何使用Silverlight直接上载Blob到Windows Azure存储中,通过本文引用的解决方案,我们最终实现了可以上载任意大小的文件,突破默认最大只能上载64MB Blob文件的限制,你可以访问 http://slupload.cloudapp.net 试试我们最终的解决方案示例。
共享访问签名
通过共享访问签名( Shared Access Signatures ,SAS),我们可以使用Silverlight直接访问Blob存储,无需使用存储账号密钥,因此不会危及帐户的安全,下面介绍一下在 http://slupload.cloudapp.net 上我们是如何使用共享访问签名的。
为什么要使用共享访问签名
访问Windows Azure存储典型的方法是先构造一个Web请求,然后用存储账号的共享密钥签署这个Web请求,如果使用我们自己信任的代码访问存储时,这个模型可以表现得很好,但我们要将共享密钥用于Silverlight客户端代码就不行了,任何能访问Silverlight应用程序的人都可以提取出这个共享密钥,用它岂不可以完全控制我们的存储帐户了?
为了避免泄露存储密钥,一个可选的方法是用一个Web服务(它可以执行授权)代理来自客户端的所有请求,Web服务是唯一与存储交互的代码,这个方法的缺点是我们需要通过一个Web服务器转发所有请求,但让Silverlight可以直接将数据发送给存储服务,并且不用泄露我们的存储凭据,我们决定一试。
共享访问签名允许我们将签署Web请求的代码独立出来,一个共享访问签名是一串可以附加给为Web请求进行授权的URL的字符串,共享访问签名中包含了哪些操作是允许的策略,还有一个URL创建者的签名。Silverlight取得对共享访问签名的访问后,我们可以通过它将授权传递给客户端,Silverlight就可以直接访问Blob存储了,但只有有限的访问权限。
创建共享访问签名
使用最新的存储客户端库创建共享访问签名非常简单,下面的代码来自 http://slupload.cloudapp.net,创建了一串预授权读取访问的RUL:
{
Permissions = SharedAccessPermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromMinutes(10)
};
blobsListView.DataSource =
from CloudBlob blob in container.ListBlobs(new BlobRequestOptions() { UseFlatBlobListing = true })
select new Uri(blob.Uri.AbsoluteUri + blob.GetSharedAccessSignature(readPolicy));
第一条语句是创建策略,它指定了10分钟的只读访问权,第二条语句列出了某个容器中所有的Blob,创建了一串有共享访问签名的URI,我在 View.aspx 页面上用它进行数据绑定。
为了获得特定Blob的写访问权,可以使用上面一样的代码,只需将只读权限改为写入权限即可,但对于 http://slupload.cloudapp.net ,我希望让用户可以上载任意名称任意大小的文件,为了实现这一目标,我创建了一个共享访问签名附加给容器,而不是附加给某个Blob。
var container = blobs.GetContainerReference(ContainerName);
container.Create();
var sas = container.GetSharedAccessSignature(new SharedAccessPolicy()
{
Permissions = SharedAccessPermissions.Write,
SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromMinutes(10)
});