云计算 频道

支招:使用Silverlight实现无限大小上载

  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:

    var readPolicy = new SharedAccessPolicy()
    {
        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。

    ContainerName = Guid.NewGuid().ToString();
    
    var container
= blobs.GetContainerReference(ContainerName);
    container.Create();
    
    var sas
= container.GetSharedAccessSignature(new SharedAccessPolicy()
    {
        Permissions
= SharedAccessPermissions.Write,
        SharedAccessExpiryTime
= DateTime.UtcNow + TimeSpan.FromMinutes(10)
});
0
相关文章