1

有線の問題に直面しています..

特定のユーザーが Azure-Container との間でファイルを読み書きできるようにしたいと考えています。このために、SharedAccessSignature の概念を使用しています。

クライアントがアクセス キーを取得するために呼び出す RESTFUL (ASP.NET MVC4) Web サービスで共有アクセス署名を生成しています。

  CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
  CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient ();
  CloudBlobContainer container = blobClient.GetContainerReference (containerName);
  container.CreateIfNotExist ();
  BlobContainerPermissions containerPermissions = new BlobContainerPermissions ();
  containerPermissions.PublicAccess = BlobContainerPublicAccessType.Off;
  container.SetPermissions (containerPermissions);
  string sas = container.GetSharedAccessSignature (new SharedAccessPolicy ()
        {
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes (30),
            Permissions = SharedAccessPermissions.Write | SharedAccessPermissions.Read
        });
  //return sas to user

sas次のコードを使用して BLOB をアップロードしようとするクライアントに戻ります。

  CloudBlobClient sasBlobClient = new CloudBlobClient ("http://127.0.0.1:10000/devstoreaccount1", new StorageCredentialsSharedAccessSignature (sak));
  CloudBlob blob = sasBlobClient.GetBlobReference (containerName + "/myblob.txt");
  blob.UploadText ("Hello SAS World");

最後の行で、クライアントが例外をスローします

サーバーは要求を認証できませんでした。Authorization ヘッダーの値が、署名を含めて正しく形成されていることを確認してください。

内部例外: {"リモート サーバーがエラーを返しました: (403) 許可されていません。"}

興味深いのは、クライアント側のコードを取得した直後に配置するsas (string sas = container.GetShare....... )と、例外なく動作することです。しかし、クライアント コードを別のコンソール アプリケーション (その後、REST 呼び出しを介してキーを取得する) に配置すると、例外がスローされます。

4

1 に答える 1

2

コンソール アプリケーションでコードをテストしたところ、正常に動作しました (sas 変数を CloudBlobClient に渡しました)。しかしその後、ASP.NET Web API を使用して REST サービスをセットアップし、WebClient を使用してキーを取得しました。

  WebClient wc = new WebClient();
  var sas = wc.DownloadString("http://127.0.0.1:47413/api/values/1");

Web アプリケーションとコンソール アプリケーションの両方で、Trace を使用して出力ウィンドウに SAS キーを書き込んだ結果、次のようになりました。

ウェブアプリ: ?se=2012-08-02T19%3A54%3A53Z&sr=c&sp=rw&sig=oWEF7r5HpkEh%2BH1aTVKGR7VF3gbWwq84gv%2BZFbXRhOA%3D

クライアント: "?se=2012-08-02T19%3A54%3A53Z&sr=c&sp=rw&sig=oWEF7r5HpkEh%2BH1aTVKGR7VF3gbWwq84gv%2BZFbXRhOA%3D"

ご覧のとおり、SAS キーが二重引用符で囲まれているように見えます。REST サービスの作成に何を使用しているかはわかりませんが、ASP.NET Web API を使用しています。ここでは、JSON フォーマッターをデフォルトのフォーマッターとして使用しています。したがって、返される SAS キーは正しいですが、唯一の問題は、JSON 形式で返されることです。

実際の SAS キーを取得するには、それを文字列に逆シリアル化する必要があります (奇妙に聞こえますか?)。Json.NET の例を次に示します。

var correctSAS = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(sas);
于 2012-08-02T19:35:33.250 に答える