2017-09-11 69 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

相关问题