【问题标题】:How to provide security for blob storage in Windows Azure如何为 Windows Azure 中的 blob 存储提供安全性
【发布时间】:2015-02-24 14:37:00
【问题描述】:

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

但我需要像我的网站一样访问来自 blob-storage 的任何 blob,这些 blob 可能来自 url 或代码。但我不应该通过粘贴 blob 的 url 从另一个浏览器访问它。因此,除非并且直到我没有登录我的应用程序,否则我应该无法访问 blob 存储 url。请让我知道我们如何才能做到这一点。

【问题讨论】:

    标签: azure azure-storage


    【解决方案1】:

    最简单的方法是使用Shared Access Signature (SAS),它的有效期很短(30 秒甚至更短)。如您所知,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。

    【讨论】:

    • 谢谢。感谢您的回复。我从您的回复中得到了线索,并按照另一个答案发布了新的实施。
    • 这可能是一个愚蠢的问题,但不是在容器上设置 SAS,而是在单个 blob 上设置它,因此您只能访问该 blob 而不能访问同一容器中的其他 blob?
    【解决方案2】:

    我找到了解决方法。我将容器访问级别设为 Private 并在我的应用程序中编写 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 访问时,它显示未经授权的访问。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2019-10-13
      • 2022-10-21
      • 2012-07-15
      • 2015-01-02
      • 2015-10-01
      • 2014-09-19
      相关资源
      最近更新 更多