2017-09-11 12 views
0

C++ Azure APIを使用して、Azure上のコンテナの共有アクセス署名を生成し、アクセス文字列を取得します。しかし、良い例は見つけられません。ほとんどすべての例はC#にあります。のみこれを見つけ、ここでhttps://docs.microsoft.com/en-us/azure/storage/files/storage-c-plus-plus-how-to-use-filesC++で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" 

、のように見える、私は私のブロブをアクセスできませんでした。このポリシーを使用しての「Microsoft Azureストレージエクスプローラー」により作成された右のトークンが例外について

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

、のように見える、私は、関数内のすべてのこれらのコードを入れました。最後の行がなければ、すべてが問題ありません。しかし、最後の行が追加された場合、この関数を終了すると、例外がスローされ、ブレークポイントが発生したという。これは、中)_Deallocate(の最後の行で停止 "C:\ 2017 \コミュニティ\ VC \ツールのMicrosoft Visual Studioの\ \ MSVC \ 14.10.25017 \は\ xmemory0を含める"、

::operator delete(_Ptr); 

はなぜこの見当がつかない例外がスローされ、どのように私のコードで捕まえることができないように見えるのでデバッグするのですか?

編集

返されたトークンが正しい

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

に最後の行を変更した後、私はそれを使用して、私のブロブをアクセスすることができます。しかし、迷惑な例外は

:-(まだそこだけデバッグに構築するときに例外のみ起こった。リリースには、すべてがOKであれば。それは環境をコンパイルに関連していますので、多分見つけ

編集です。

+0

「最後の行にあるトークンが正しくない」ということを説明してください。質問を編集し、この情報を含めてください。また、例外の詳細を含めてください。 –

+0

返事をありがとう。編集済み@GauravMantri – Harrison

+0

Microsoft Azure Explorerのトークンが機能していて、編集前のトークンがなぜそうでなかったのかについての説明が必要ですか?私にお知らせください私は詳細を提供します。 –

答えて

1

Shared Access Signature (SAS)を作成する際には、SAS Start/Expiry、Permissions、IP ACL、Protocol restrictionsなどのいくつかのアクセス権があります。これらのものを使ってBLOBコンテナにアクセスポリシーを作成し、広告を作成します-hocこれらのものを使ってSAS(すなわちアクセスポリシーなし)を作成するか、またはこれらの2つを組み合わせてSASトークンを作成します。

重要なことは、アクセスポリシーで何かが定義されている場合は、SASを作成するときにそのポリシーを再定義できないということです。たとえば、Read権限だけを持つアクセスポリシーを作成し、それ以外のものは作成しないと、このアクセスポリシーを使用しているときにSASトークンを作成するときにはアクセス権を与えることはできません。アクセスポリシーに含まれていないものを確実に定義することができます(たとえば、アクセスポリシーで定義されていない場合は、SASの有効期限を定義できます)。

あなたのコードを(編集する前に)見ると、いくつかの権限を持つアクセスポリシーを作成してから、同じアクセス権とアクセスポリシーを使用してSASトークンを作成しています。それがうまくいかない理由です。しかし、MicrosoftのストレージエクスプローラからSASトークンを作成したときには、アクセスポリシー(si=Signature11111122222222)のみが含まれており、その他のパラメータは含まれていないことに気が付きました。

編集後のコードでは、アクセス許可ポリシーを使用しただけでアクセス許可ポリシーを使用していたため、編集後に作業が行われました。

これは、SASトークンの作業/作業の背後にある謎を説明してくれることを願っています。

+0

あなたの時間とこの詳細な説明に感謝します。 – Harrison

関連する問題