2

単一の BLOB の共有アクセス署名を取得し、REST API を使用して BLOB をダウンロードしようとしています。ただし、禁止されている 403 エラー メッセージが常に表示されます。ストレージ エミュレーターとクラウドの両方で。これが私のコードです:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myConnectionStringHere...");

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("containerName");
CloudBlob blob = container.GetBlobReference("blobName");

string sasToken = blob.GetSharedAccessSignature(new SharedAccessPolicy()
            {
                Permissions = SharedAccessPermission.Read,
                SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromHours(24)
            }
            );

string completeUri = string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sasToken);

// now use the uri to make the rest call and download
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(completeUri);
request.Method = "GET";
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
    using (Stream s = resp.GetResponseStream())
        {
            using (FileStream fs = new FileStream("test.jpg", FileMode.Create, FileAccess.Write))
                {
                        byte[] buffer = new byte[8 * 1024];
                        int len;
                        while ((len = s.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            fs.Write(buffer, 0, len);
                        }
                    }
                }
            }

GetResponse を呼び出すと、403 エラーが発生し続けます。どんな助けでも大歓迎です!

編集:言及するのを忘れました:私は最新のAzure SDK(2.0)を使用しています

編集 2: いろいろ試して、Azure Management Studio というツールを見つけました。このツールは、SAS トークンを作成できます。私はそれを行い、それを REST 呼び出しコードで使用しました。これは問題なく機能したため、エラーは私が作成したトークン作成コード内にある必要があります。ただし、sas 文字列の形式はまったく同じです。他に何を試せばいいのかわからない

4

1 に答える 1

8

私が気づいたいくつかのこと:

  1. SDK 2.0 を使用しているとのことですが、最新のストレージ クライアント ライブラリ (2.0.6) を使用していないと思います。コードから、古いストレージ クライアント ライブラリ (1.8) をまだ使用しているようです。Microsoft.WindowsAzure.StorageClientまたはを参照している場合は、コードをチェックインしてくださいMicrosoft.WindowsAzure.Storage。以前の場合は、古いライブラリを使用しています。
  2. 古いストレージ クライアント ライブラリを使用している場合は、古いストレージ REST API を使用する古いストレージ クライアント ライブラリでは、匿名 SAS トークン (つまり、コンテナー アクセス ポリシーのないトークン) に対して有効期限を指定できないことに注意してください。現在時刻から 1 時間 (もちろん UTC)。URL を使用しようとすると、次のエラー メッセージが表示されます (AuthenticationErrorDetailノードの下:

署名付き識別子のないアクセスでは、1 時間を超える時間枠を設定できません

有効期限が 1 時間未満の SAS トークンを作成してみてください。例えば

var sasToken = blob.GetSharedAccessSignature(new SharedAccessPolicy
    {
        Permissions = SharedAccessPermission.Read,
        SharedAccessExpiryTime = DateTime.UtcNow + TimeSpan.FromMinutes(30)
    }
);

古いストレージ クライアント ライブラリを引き続き使用する場合は、いくつかの選択肢があります。

  1. 上記で説明したように、有効期間が 1 時間未満の SAS トークンを作成します。
  2. コンテナー レベルのアクセス ポリシーを使用して、SAS トークンを作成します。コンテナー レベルのアクセス ポリシーを使用すると、有効期限が 1 時間を超える SAS トークンを定義できます。詳細については、ここをクリックしてください: http://msdn.microsoft.com/en-us/library/windowsazure/ee393341.aspx

新しいストレージ クライアント ライブラリを使用すると、コンテナー アクセス ポリシーを使用せずに、より長い期間のトークンを定義できます。ただし、ライブラリの 2 つのバージョンには多くの違いがあり、古いバージョンから新しいバージョンへの移行は簡単ではありません。数日前に、古いバージョンから新しいバージョンへのコードの移行に関するブログ投稿を書きました。ここで読むことができます: http://gauravmantri.com/tag/storage-client-library/ . 最後に、 SASに関するブログ投稿を書きました。

于 2013-07-10T13:46:50.257 に答える