2016-11-29 100 views
1

我有一個應用程序,用戶可以看到存儲在azure blob存儲上的圖像。我希望圖像網址只在用戶登錄時纔有效。複製圖像網址並在另一個瀏覽器上粘貼不起作用。不知道如何做到這一點。已經在其上使用SAS並且有到期時間。所以鏈接將工作半小時。我只想讓登錄用戶訪問它,而不是時間限制。製作Azure blob Url只能訪問登錄用戶

回答

0

要在Blob存儲訪問文檔,他們可以是

  1. 公共
  2. 與關鍵
  3. 與SAS令牌訪問的訪問的

存儲無法知道你的身份驗證系統。如果您不希望按時間綁定令牌,則可以在容器中設置共享訪問策略,在該處設置到期時間,並僅引用SAS令牌中的策略。然後,您可以稍後再次在策略中設置到期時間,而不重新生成令牌。

但其他時間限制的SAS令牌是您可以做的唯一的事情。

1

我建議一種替代方法 - 將自己的圖像檢索功能作爲自己的控制器(圖像控制器)公開。這將允許您限制只有登錄用戶才能訪問圖像。如果你這樣做,從你的容器中刪除公共訪問。

這種方法的另一個好處是,如果您選擇將圖像託管在別處(即不在blob存儲中),則只需更改控制器,其他部分代碼將保持不變。也就是說,控制器封裝了您的圖像託管邏輯。

+0

這將如何工作? 標記需要一個實際的URL來顯示圖像。如何將其轉換爲其他內容? – InTheWorldOfCodingApplications

+0

在你的代碼中,你寫了asp.net,所以我假設你有一些你的應用程序正在與之通信的休息端點。在這種情況下,您的控制器的獲取端點現在將作爲URL:www.yoursitename.com/Images/imageid。 – PartlyCloudy

+0

一些更多細節 - get image端點將返回一個HttpResponseMessage,圖片字節作爲內容,ontent.Headers.ContentType是您的圖片類型,例如MediaTypeHeaderValue(「image/jpeg」) – PartlyCloudy

1

我通常使用HttpHandler。

示例代碼段:

public class BlobHandler : IHttpHandler, IReadOnlySessionState 
    {  
    public void ProcessRequest(HttpContext context) 
    { 
     var request = context.Request; 
     var response = context.Response; 
     var path = request.Url.AbsolutePath; 
     var parts = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 

     // fetch record from db 
     var attachment = Attachment.FetchByUrl(parts[parts.length - 1]); 

     if (attachment == null) 
      throw new HttpException(404, "Blob not found."); 

     // helper method - get a blob instance, if it doesn't exist return null 
     var blob = CloudStorage.GetBlob(Constants.StoragePrivateContainer, attachment.BlobPath); 

     if (blob == null) 
      throw new HttpException(404, "Blob not found."); 

     // custom auth 
     if (!context.Request.IsAuthenticated) 
      throw new HttpException(403, "Access denied."); 

     var p = context.User as CustomPrincipal; 

     if (p == null) 
      throw new HttpException(403, "Access denied."); 

     if (!p.IsInRole(Enums.Role.Downloader)) 
      throw new HttpException(403, "Access denied."); 

     blob.DownloadToStream(context.Response.OutputStream); 
      response.ContentType = blob.Properties.ContentType; 
      response.Flush();    
    } 

    public bool IsReusable => true; 
    } 

忽略RouteConfig 「斑點」 路徑:

routes.IgnoreRoute("blob/{*pathInfo}"); 

添加到處理程序處理部分在web.config中:

<add name="Blobs" path="blob/*" verb="*" type="MyLibrary.BlobHandler" resourceType="Unspecified" preCondition="integratedMode" /> 

正如其他建議 - 不要忘記將你的容器設置爲「私人」。

+0

由於我們先下載blob,是不是內存廣泛?不直接設置 InTheWorldOfCodingApplications

+0

例如,當您製作html圖像時,您只需使用:

+0

獲取CloudBlockBlob的實例不會加載blob的內容(即使獲取需要調用FetchAttributes方法的元數據)。在HTTP處理程序中,您只需打開HTTP響應流,然後直接從blob內容中用字節「填充」它。 –

相關問題