C++如何获取Azure容器的共享访问签名

how to get shared access signature of Azure container by C++

我想使用 C++ Azure API 为 Azure 上的容器生成共享访问签名并获取访问字符串。但找不到任何好的例子。几乎所有示例都使用 C#。才找到这个,https://docs.microsoft.com/en-us/azure/storage/files/storage-c-plus-plus-how-to-use-files

这是我所做的,

    // 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()。

有人可以告诉我我的代码有什么问题吗?或者关于这个的一些例子?非常感谢。

已编辑

我得到的token是这样的,

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

因此,我无法访问我的 blob。 "Microsoft Azure Storage Explorer" 使用此策略创建的正确令牌如下所示,

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

关于异常,我把所有这些代码都放在一个函数中。如果没有最后一行,一切都很好。但是如果加入最后一行,在退出这个函数的时候,会抛出一个异常,说断点被触发了。它在 "C:\Microsoft Visual Studio17\Community\VC\Tools\MSVC.10.25017\include\xmemory0"、

中的 _Deallocate() 的最后一行停止
::operator delete(_Ptr);

不知道为什么会抛出这个异常以及如何调试,因为它似乎无法被我的代码捕获。

已编辑

将最后一行更改为后,

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

返回的令牌是正确的,我可以使用它访问我的 blob。但是烦人的异常仍然存在:-(

已编辑

刚发现只有在Debug中构建时才会出现异常。如果在 Release 中,则一切正常。所以可能跟编译环境有关

创建 Shared Access Signature (SAS) 时,您设置了一些权限:SAS Start/Expiry、权限、IP ACLing、协议限制等。现在您可以做的是在带有这些东西的 blob 容器,用这些东西创建一个临时 SAS(即没有访问策略)或将这两者结合起来创建一个 SAS 令牌。

要牢记的一件重要事情是,如果在访问策略中定义了某些内容,则您不能在创建 SAS 时重新定义它们。因此,例如,假设您创建了一个仅具有 Read 权限且没有其他权限的访问策略,那么在使用此访问策略创建 SAS 令牌时您无法提供任何权限。您当然可以定义访问策略中没有的东西(例如,如果访问策略中没有定义,您可以定义 SAS 到期)。

如果您查看您的代码(编辑前),您所做的是创建具有某些权限的访问策略,然后使用相同的权限和访问策略创建 SAS 令牌。这就是它不起作用的原因。但是,当您从 Microsoft 的存储资源管理器创建 SAS 令牌时,您会注意到它仅包含访问策略 (si=Signature11111122222222) 和其他参数的 none,这就是它起作用的原因。

在编辑后的代码中,您没有包含任何权限,而仅使用了访问策略(以某种方式执行存储资源管理器正在执行的操作),这就是编辑后一切正常的原因。

我希望这能解释 working/working SAS 令牌背后的奥秘。