2013-05-06 30 views
1

我有一個blob容器,該ACL設置爲允許完全公共讀取訪問,以便任何人都可以讀取和列出該容器中的blob。Azure存儲連接字符串沒有帳戶密鑰 - 公共容器

我存儲了文件,所以我的客戶端使用的WPF客戶端應用程序可以讀取它們,但我不想讓它們修改/刪除/創建文件。

有沒有人知道在這種情況下應該使用什麼樣的連接字符串?

我希望沒有指定帳戶鍵連接字符串和/或共享訪問密鑰由於斑點被公開,但沒有奏效 - StorageAccount.Parse拋出出現FormatException

回答

0

正如前面的答案中提到,最好的做法通常是控制訪問您的blob容器使用共享訪問簽名(SAS)或存儲的訪問策略。這些可用於創建訪問令牌(字符串),您可以傳遞給客戶端而不會泄露您的賬戶密鑰。

但是,還可以指定對容器中保存的Blob和元數據的公共讀取訪問級別。公共訪問權限是爲擁有容器或Blob的公共訪問URL的匿名用戶自動讀取權限的級別。您不能使用公共訪問權給匿名用戶對容器寫入權限。如果您需要向不擁有Azure存儲帳戶的帳戶密鑰的用戶授予寫入權限,則需要爲這些用戶提供一個以url形式的令牌,這些令牌可以是共享訪問簽名或共享訪問策略。 如果當前沒有關閉blob容器的公共訪問(私有),則匿名用戶將能夠使用公共訪問URL(如以下內容)讀取容器中的所有Blob。

http://grassy.blob.core.windows.net/container1/image2.jpg 

當您創建的容器,可以將publicAccess屬性的值設置爲BlobContainerPublicAccessType枚舉的適當的常數。 publicAccess屬性的值可以是以下三個指定公共讀訪問級別的常量之一。

•BLOB - 公衆可以讀取此容器中的blob的內容和元數據,但無法讀取容器元數據或在容器中列出blob。

•容器 - 公衆可以讀取blob內容和元數據以及容器元數據,並可以在容器中列出blob。

•OFF - 指定沒有公共訪問。只有帳戶所有者才能讀取此容器中的資源。

所以在這種情況下,公共訪問級別可能設置爲CONTAINER。例如:

public static void main(String[] args) throws InvalidKeyException, URISyntaxException, StorageException 
    {    
    Account creds = new Account();    
    final String storageConnectionString = creds.getstorageconnectionstring(); 
    CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString); 
    CloudBlobClient blobClient = storageAccount.createCloudBlobClient(); 
    CloudBlobContainer container = blobClient.getContainerReference("container1"); 
    container.createIfNotExist(); 
    BlobContainerPermissions containerPermissions = new BlobContainerPermissions(); 
    containerPermissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER); 
    container.uploadPermissions(containerPermissions); 
    BlobContainerPublicAccessType access1 = containerPermissions.getPublicAccess(); 
    System.out.println("Public access to " + container.getName() + " is set to: 
     " + access1); 
    } 

如果container1公衆訪問級別已設置的容器,匿名用戶應該能夠列出container1只知道存儲帳戶帳戶名(「草」)的斑點和容器名稱,但不需要知道AccountKey。例如,一個匿名的應用程序可能使用類似下面的Java代碼:

public static void main(String[] args) throws InvalidKeyException, URISyntaxException, StorageException, FileNotFoundException, IOException 
    {    
    URI baseuri = new URI("http://grassy.blob.core.windows.net"); 
    CloudBlobClient blobclient = new CloudBlobClient(baseuri); 
    CloudBlobContainer container = blobclient.getContainerReference("container1"); 
     for (ListBlobItem blobItem : container.listBlobs()){System.out.println(blobItem.getUri());} 
    } 

然而,如上所述,這是一個更好的做法,以避免給匿名用戶訪問。相反,使用SAS或策略控制對容器的訪問,並將令牌傳遞給已知用戶。

+0

MArk,這正是我的使用案例 - 我有一個CONTAINER訪問策略的容器,允許所有用戶列出並下載數據 - 完全同意你寫的內容。 我的問題涉及到,我的所有客戶端都有WPF應用程序,這些應用程序必須在應用程序第一次啓動時在該容器中列出*文件*,並將所有腳本等列表找出並執行一些活動它。問題是,從這一刻起,我不知道如何將app.config文件作爲容器連接字符串放入,因爲AFAIK即使對於PUBLIC CONTAINERS - 鍵所需 – 2013-05-11 12:00:36

+0

請參閱我的答案的更新。添加的代碼片段應該允許任何匿名用戶在容器中列出blob。 – 2013-05-13 17:33:30

+0

好吧,您的基於代碼的解決方案使我嘗試將配置文件中的連接字符串設置爲簡單 那(顯然)工作 - 謝謝。 – 2013-05-15 07:11:43

1

StorageAccount並不意味着據我所知,連接到公共blob。您只需使用類似WebClient或其他任何可以通過公共http/https端點下載數據的工具,通過公共URL訪問公共blob。

+1

我想讓我的WPF客戶端應用程序直接訪問BLOB的原因是爲了避免所有流量通過我的Web服務器,並使用Azure本身擴展文件傳輸而不會導致我的網站出現性能問題。 – 2013-05-11 11:50:39

0

您可以爲此使用共享訪問簽名。你可以做的是在blob容器上創建SAS,它只允許在BLOB容器上列出和讀取權限,然後將SAS URI分發給客戶端。然後,您的代碼可以使用該SAS URI創建一個BlobContainer對象的實例。

下面是使用SAS URI斑點容器列出斑點的代碼示例:

static void ListBlobsWithStorageClientLibrary(string blobContainerSasUri) 
{ 
    CloudBlobContainer blobContainer = new CloudBlobContainer(new Uri(blobContainerSasUri)); 
    var blobs = blobContainer.ListBlobs(null, true); 
    foreach (var blob in blobs) 
    { 
     Console.WriteLine(blob.Uri); 
    } 
} 

其它替代方法是創建使用SAS令牌StorageCredentials對象的一個​​實例:http://msdn.microsoft.com/en-us/library/windowsazure/jj682529.aspx。然後,您可以使用該StorageCredentials對象創建一個CloudStorageAccount對象的實例。

我寫了一個詳細的崗位上使用共享訪問簽名與Blob存儲,您可以在這裏閱讀:http://gauravmantri.com/2013/02/13/revisiting-windows-azure-shared-access-signature/

+0

我知道SAS,但它是PUBLIC容器 - 如果我給你簡單的URL,並且你在瀏覽器中輸入它,你會得到這個文件 - 完全沒有問題。這裏的第二件事是,如果我的網站關閉了,那麼就沒有辦法給他們發送令牌。我的設計目標是向他們提供始終以最小的失敗風險工作的雲存儲文檔 - 我最好只依賴Azure blob存儲可用性。 – 2013-05-11 11:54:27