2017-09-11 120 views
0

我想使用C++ Azure API爲Azure上的容器生成共享訪問簽名並獲取訪問字符串。但找不到任何好的例子。幾乎所有的例子都在C#中。只有發現了這一點,https://docs.microsoft.com/en-us/azure/storage/files/storage-c-plus-plus-how-to-use-files如何通過C++獲取Azure容器的共享訪問簽名

這是我做什麼,

// Retrieve a reference to a previously created container. 
    azure::storage::cloud_blob_container container = blob_client.get_container_reference(s2ws(eventID)); 

    // Create the container if it doesn't already exist. 
    container.create_if_not_exists(); 

    // Get the current permissions for the event. 
    auto blobPermissions = container.download_permissions(); 

    // Create and assign a policy 
    utility::string_t policy_name = s2ws("Signature" + eventID); 

    azure::storage::blob_shared_access_policy policy = azure::storage::blob_shared_access_policy(); 

    // set expire date 
    policy.set_expiry(utility::datetime::utc_now() + utility::datetime::from_days(10)); 

    //give read and write permissions 
    policy.set_permissions(azure::storage::blob_shared_access_policy::permissions::read); 

    azure::storage::shared_access_policies<azure::storage::blob_shared_access_policy> policies; 
    //add the new shared policy 
    policies.insert(std::make_pair(policy_name, policy)); 

    blobPermissions.set_policies(policies); 
    blobPermissions.set_public_access(azure::storage::blob_container_public_access_type::off); 

    container.upload_permissions(blobPermissions); 

    auto token = container.get_shared_access_signature(policy, policy_name); 

後來看這個問題,我可以看到政策的成功設置在容器上,但最後一行拿到令牌是不正確的。並且退出此函數時總會有一個異常,斷點位於_Deallocate()中。

有人能告訴我我的代碼有什麼問題嗎?或者關於這個的一些例子?非常感謝你。

編輯

我看起來像道理,

"sv=2016-05-31&si=Signature11111122222222&sig=JDW33j1Gzv00REFfr8Xjz5kavH18wme8E7vZ%2FFqUj3Y%3D&spr=https%2Chttp&se=2027-09-09T05%3A54%3A29Z&sp=r&sr=c" 

由此看來,我無法訪問我的斑點。通過「微軟Azure存儲資源管理器」使用此策略的創建權限令牌的樣子,

?sv=2016-05-31&si=Signature11111122222222&sr=c&sig=9tS91DUK7nkIlIFZDmdAdlNEfN2HYYbvhc10iimP1sk%3D 

關於例外,我把所有這些代碼的功能。如果沒有最後一行,一切都可以。但如果添加最後一行,在退出此函數時,它會拋出異常並表示觸發了一個斷點。它停在_Deallocate()的最後一行的 「C:\微軟的Visual Studio \ 2017年\社區\ VC \工具\ MSVC \ 14.10.25017 \包括\ xmemory0」,

::operator delete(_Ptr); 

不知道爲什麼這個拋出異常以及如何調試,因爲它似乎無法被我的代碼捕獲。

編輯

改變的最後一行,

auto token = container.get_shared_access_signature(azure::storage::blob_shared_access_policy(), policy_name); 

返回的標記是正確的,我可以用它訪問我的斑點。但惱人的例外仍然存在:-(

編輯

剛剛發現的例外只有建設調試當發生過。如果在發行,一切都很好。所以也許它涉及到編譯環境。

+0

你能否描述一下你的意思,但最後一行得到的標記是不正確的。請編輯您的問題幷包含此信息。另外,請包括您得到的例外的詳細信息。 –

+0

感謝您的回覆。編輯@GauravMantri – Harrison

+0

您是否還需要解釋爲什麼來自Microsoft Azure Explorer的令牌起作用,並且您得到的令牌(編輯前)沒有?請讓我知道,我會提供詳細信息。 –

回答

1

創建Shared Access Signature (SAS)時,您設置了一些權限:SAS啓動/到期,權限,IP ACLing,協議限制等。現在您可以做的是在blob容器上創建一個訪問策略,並創建一個廣告-s SAS(即沒有訪問策略)與這些事物相結合或者將這兩者結合起來創建一個SAS令牌。

請記住一點,如果在訪問策略中定義了某些內容,則在創建SAS時無法重新定義它們。例如,假設您創建的訪問策略只有Read權限而沒有其他任何權限,那麼在使用此訪問策略時創建SAS令牌時不能提供任何權限。您當然可以定義訪問策略中不存在的內容(例如,如果未在訪問策略中定義SAS定義,您可以定義它)。

如果您查看您的代碼(在編輯之前),您正在做的是創建具有某些權限的訪問策略,然後使用相同的權限和訪問策略創建SAS令牌。這就是爲什麼它不起作用。但是,當您從Microsoft的存儲資源管理器創建SAS令牌時,您會注意到它僅包含訪問策略(si=Signature11111122222222)以及其他所有參數,這就是它工作的原因。

在編輯後的代碼中,您沒有包含任何權限,但僅使用訪問策略(以您執行Storage Explorer操作的方式),這就是編輯後工作的原因。

我希望這解釋了不工作/工作SAS令牌背後的奧祕。

+0

真棒,感謝您的時間和這個詳細的解釋。 – Harrison

相關問題