如何在Windows Azure中为blob存储提供安全性

时间:2015-02-23 06:17:42

标签: azure azure-storage

我希望在Windows Azure中提供对blob存储的访问权限,这样只有一个域可以访问container中的blob。我发现有容器的公共,私人和共享访问。但它们不符合我的要求。在公共场合,我们可以随时从url访问blob。在私下,我们无法从网址访问,但如果我们提供存储帐户凭据,则可以从代码访问。在共享访问中,我们可以根据策略访问一段时间。

但是我需要我的网站应该访问blob-storage中可能来自网址或代码的任何blob。但我不应该只是粘贴一个blob网址从另一个浏览器访问它。因此,除非我没有登录我的应用程序,否则我将无法访问blob存储URL。请让我知道如何实现这一目标。

2 个答案:

答案 0 :(得分:2)

实现这一目标的最简单方法是使用有效期很短(30秒甚至更短)的Shared Access Signature (SAS)。如您所知,SAS提供对存储资源的基于时间限制/权限的访问。所以你可以做的是保持你的blob容器的ACL Private而不是Blob/Container

假设您正在使用.Net客户端库并构建MVC应用程序,您在控制器中执行的操作是使用SAS权限在容器上创建Read,该权限的持续时间非常短并将该SAS令牌传递给您的视图。然后,您可以将SAS令牌附加到视图中的图像URL。

控制器代码:

        var cloudStorageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
        var container = cloudStorageAccount.CreateCloudBlobClient().GetContainerReference("container");
    var sas = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
        {
            SharedAccessExpiryTime = DateTime.UtcNow.AddSeconds(30),
            Permissions = SharedAccessBlobPermissions.Read
        });
    ViewBag.SasToken = sas;

查看代码:

<img src="https://myaccount.blob.core.windows.net/container/myimage.png@Html.Raw(ViewBag.SasToken)" />

请注意,这不是100%万无一失,因为在SAS有效的时候,任何人都可以复制URL并获取图像,但是通过保持SAS有效的持续时间可以减轻问题,因为一旦SAS过期,即使某人有URL,他们也无法访问blob。

答案 1 :(得分:0)

我找到了解决方法。我将容器访问级别设置为专用,并在我的应用程序中编写 HTTP处理程序,以便检索blob文件,我在ProcessRequest方法中编写如下所示的逻辑。

<强>处理程序

     public void ProcessRequest(HttpContext context)
      {
        // Get the file name. 
        string fileName = string.Empty;
        string blobContainerName = string.Empty;

           if (HttpContext.Current.Session["UserName"] != null)
        {
            if (context.Request.QueryString["filename"] != null)
            {
                fileName = context.Request.QueryString["filename"];
            }

            if (context.Request.QueryString["source"] != null)
            {
                blobContainerName = context.Request.QueryString["source"];
            } 

            // Get the blob from blob storage.
            var storageAccount = CloudStorageAccount.Parse(
            CloudConfigurationManager.GetSetting("StorageConnectionString"));
            var blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference(blobContainerName);
            // Retrieve reference to a blob named "FlexpathBlob".
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);

            // Read blob content to response.
            context.Response.Clear();
            try
            {
                blockBlob.FetchAttributes();
                context.Response.ContentType = blockBlob.Properties.ContentType;
                blockBlob.DownloadToStream(context.Response.OutputStream);
            }
            catch (Exception ex)
            {
                context.Response.Write(ex.ToString());
            }

            context.Response.End();
        }
        else {
            context.Response.Write("You are not authorized to view this file.");
        }
    }

从视图中访问

查看

<img id="imgVehicleImage1790" src="/Handlers/FileReciever.ashx?source=dealerinventory&amp;filename=1790_3b733b4e-b692-4650-95a6-855eb55145c4.png" style="border-width: 0px;width:208px;height:126px;">

这对我来说很好。我可以访问所有图像和其他blob文件。当我尝试从blob url访问时,它显示未经授权的访问。谢谢!