如何通过C 获得Azure容器的共享访问签名
how to get shared access signature of Azure container by C++
我想使用c azure api来生成Azure上容器的共享访问签名并获取访问字符串。但是找不到任何好的例子。几乎所有示例都在C#中。仅找到这个,https://learn.microsoft.com/en-us/azure/storage/files/storage-c-plus-plus-plus-how-to-us-us-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()中。
有人可以告诉我我的代码怎么了?还是关于此的一些例子?非常感谢。
编辑
我看起来像的令牌,
"sv=2016-05-31&si=Signature11111122222222&sig=JDW33j1Gzv00REFfr8Xjz5kavH18wme8E7vZ%2FFqUj3Y%3D&spr=https%2Chttp&se=2027-09-09T05%3A54%3A29Z&sp=r&sr=c"
通过这个令牌,我无法访问斑点。使用此策略的" Microsoft Azure Storage Explorer"创建的右令牌看起来像
?sv=2016-05-31&si=Signature11111122222222&sr=c&sig=9tS91DUK7nkIlIFZDmdAdlNEfN2HYYbvhc10iimP1sk%3D
关于例外,我将所有这些代码都放在函数中。如果没有最后一行,一切都还好。但是,如果添加了最后一行,则在退出此功能时会引发异常,并说断点是被触发的。它停在" C: Microsoft Visual Studio 2017 community vc tools msvc 14.10.25017 include xmemory0",
的最后一行。::operator delete(_Ptr);
不知道为什么要抛出这个例外以及如何调试,因为它似乎无法被我的代码捕获。
编辑
将最后一行更改为
auto token = container.get_shared_access_signature(azure::storage::blob_shared_access_policy(), policy_name);
返回的令牌是正确的,我可以使用它访问斑点。但是烦人的例外仍然存在: - (
编辑
刚刚发现只有在调试中构建时才发生的例外。如果在发布时,一切都可以。因此,也许它与编译环境有关。
创建Shared Access Signature (SAS)
时,您设置了一些权限:SAS启动/到期,权限,IP ACLING,协议限制等。用这些东西的Blob容器,与这些东西创建一个临时SAS(即没有访问策略)或将这两个组合起来创建SAS令牌。
要记住的一个关键是,如果在访问策略中定义某些内容,则在创建SAS 时无法重新定义它们。因此,例如,假设您仅使用Read
许可而创建访问策略,而没有其他内容,那么在使用此访问策略时创建SAS令牌时,您将无法提供任何权限。您当然可以定义访问策略中不存在的内容(例如,如果未在访问策略中定义SAS,则可以定义SAS到期)。
如果您查看代码(在编辑之前),则您正在做的是使用一些权限创建访问策略,然后使用相同的权限和访问策略创建SAS令牌。这就是为什么它不起作用。但是,当您从Microsoft的存储资源管理器创建SAS令牌时,您会注意到它仅包括访问策略(si=Signature11111122222222
),而没有其他参数,这就是为什么它可以使用的原因。
在编辑后的代码中,您没有包含任何权限,而只使用访问策略(以某种方式完成了存储Explorer正在执行的操作),这就是为什么在编辑后工作的原因。
我希望这解释了不工作/工作SAS令牌背后的奥秘。
- 如何访问由共享指针保存的类方法?
- 如何在类中安全地访问 const 共享数组
- 尝试通过共享指针使用变量时读取访问冲突
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 在向量中使用共享指针来访问类对象
- 越界访问 CUDA 共享内存
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 是否有更好的方法来封装成员对象可以访问的共享存储池?
- OpenMP 环路阵列访问中的错误共享
- 访问共享内存时出现读取访问冲突
- 如何使用 c++ 创建对"everyone"具有共享访问权限的文件夹
- 如何使用C++共享目录,以便每个人都可以访问
- 使用 IPC 共享内存的应用程序是否可以访问彼此的代码?
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- 多个线程访问共享资源
- 无法从C 代码访问C共享库方法
- 会员在共享_ptr上访问指针
- 在不违反严格的别名规则的情况下访问进程间共享内存中的对象
- 如何通过C 获得Azure容器的共享访问签名
- 使用哪种类型的指针来实现对集合元素的共享访问