как получить подпись общего доступа к контейнеру Azure с помощью переполнения стека

Я хочу использовать 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 ().

Может кто-нибудь сказать мне, что не так с моим кодом? Или несколько примеров по этому поводу? Большое спасибо.

отредактированный

Токен, который я получил, выглядит как

"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

Что касается исключения, я поместил весь этот код в функцию. Если без последней строки, все в порядке. Но если добавить последнюю строку при выходе из этой функции, она выдаст исключение и сообщит, что сработала точка останова. Он остановился на последней строке _Deallocate () в «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);

Вернутый токен верный, я могу получить доступ к своим BLOB-объектам, используя его. Но досадное исключение все еще есть 🙁

отредактированный

Только что обнаруженное исключение произошло только при сборке в Debug. Если в Релизе все ок. Так что, возможно, это связано с компиляцией среды.

0

Решение

При создании Shared Access Signature (SAS)Есть несколько разрешений, которые вы установили: запуск / истечение срока действия SAS, разрешения, ACLing IP, ограничения протокола и т. д. Теперь вы можете создать политику доступа к контейнеру BLOB-объектов с помощью этих вещей, создать специальный SAS (т.е. без политики доступа) с этими вещами или скомбинируйте их для создания токена SAS.

Важно помнить, что если что-то определено в политике доступа, вы не сможете переопределить их при создании SAS. Так, например, скажем, вы создаете политику доступа только с Read разрешения и ничего больше, тогда вы не можете предоставить никаких разрешений при создании токена SAS при использовании этой политики доступа. Вы, безусловно, можете определить вещи, которых нет в политике доступа (например, вы можете определить срок действия SAS, если он не определен в политике доступа).

Если вы посмотрите на свой код (перед редактированием), то вы создаете политику доступа с некоторыми разрешениями, а затем создаете токен SAS с теми же разрешениями и политикой доступа. Вот почему это не сработало. Однако, когда вы создали токен SAS из Microsoft Storage Explorer, вы заметите, что он включает только политику доступа (si=Signature11111122222222) и ни один из других параметров, и именно поэтому он работал.

В свой код после редактирования вы не включили никаких разрешений, а только использовали политику доступа (так, как вы делали то, что делает Storage Explorer), и поэтому после редактирования все работало.

Я надеюсь, что это объясняет тайну неработающих / работающих токенов SAS.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector