2017-07-26 29 views
1

アップロードするファイルが非常に大きい(500MB-1GB +)ため、ブラウザから直接SASキーを使用してアップロードしようとしています。 Azureでホストされているバックエンドを通過する。クライアントから直接SASキーを使用してAzureストレージにアップロード

私はthis great post hereに従っていますが、私はCORSの問題を手にして、403エラーを他方に当てます。

CORSエラー

いいえ「アクセス制御 - 許可原点」ヘッダが要求 資源上に存在します。したがって、オリジン 'http://localhost:36923'は許可されません。 応答はHTTPステータスコード403を持っていました。

ご覧のとおり、テスト用に私のASP MVCアプリケーションをローカルで実行してAzureにアップロードしようとしています。

と403エラーが受信:

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

私は(来年期限切れになると書き込みアクセス権を持つ)私のSAS URIを生成した方法は以下の通りです:

// First I create the blob container 
public static CloudBlockBlob CreateBlobContainer(string strContainer) 
{ 
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"].ToString()); 

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

    CloudBlobContainer container = blobClient.GetContainerReference(strContainer); 

    container.CreateIfNotExists(); 

    CloudBlockBlob blockBlob = new CloudBlockBlob(container.Uri, new StorageCredentials(ConfigurationManager.AppSettings["AccountName"], ConfigurationManager.AppSettings["AccountKey"])); 

    return blockBlob; 
} 

//Then I create a SAS key for that container 
public static string GetSaSForBlobContainer(CloudBlockBlob blob, SharedAccessBlobPermissions permission) 


    var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy() 
    { 
     Permissions = permission, 
     SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5), 
     SharedAccessExpiryTime = DateTime.UtcNow.AddYears(1), 
    }); 

    return string.Format(CultureInfo.InvariantCulture, "{0}{1}", blob.Uri, sas); 
} 

//Above methods invoked as such 
container = FileManager.CreateBlobContainer("supercontainer"); 
var sasUri = FileManager.GetSaSForBlobContainer(container, SharedAccessBlobPermissions.Write); 

だから、私はそれにアップロードすることができますURIを生成し、コンテナを作成します年以上

上記のsasUriは、JavaScriptのロジックにアクセス可能なASP MVCビューで公開されています。それは上記のブログ投稿のbaseUrlです。

は、ここに私のコンテナに設定CORSです:

CORS

は、なぜ私はこのCORSのエラーが出るのでしょうか?また、なぜ約Authorityヘッダーについてのエラー?

SAS URIを使用するという考えは、アカウント名/キーをクライアントに公開する必要がないと考えました。

何か不足していますか?

+0

そのブログの投稿と同じ男:)。 BLOBコンテナまたはBLOBにSASを作成していますか?あなたのコードから、それはあなたが容器ではなく、ブロブでそれをやっているようです。あなたが質問に含めなかったコードがいくつかありますか?もしそうなら、それを質問に含めてください。 –

+0

@ GauravMantri私は両方のC#メソッドをどのように呼び出すかを示す部分を編集しました。私はコンテナレベルでSAS発電をやっていると思うかもしれませんが、私の目は私をだましているかもしれません... –

+0

ありがとう!問題は、コンテナのURIを名前としてブロックBLOBを作成しているということです。したがって、あなたのBLOBの名前は 'https:// youraccount.blob.core.windows.net/supercontainer'です。 'CreateBlobContainer'がblobの代わりにコンテナオブジェクトを返し、' GetSaSForBlobContainer'の第1パラメータが 'CloudBlockBlob'の代わりに' CloudBlobContainer'の型になるようにSASを作成してください。試してみてください。 –

答えて

3

あなたがリンクしたブログ投稿は、あなたが実際にアップロードするファイルの名前を実際に知らないので、blobコンテナで作成される共有アクセス署名を前提としています。しかし、あなたのコードでは、blobコンテナの代わりにblobにSASを作成するので、403エラーが発生します。

この問題を解決するには、CreateBlobContainerメソッドを変更し、CloudBlockBlobではなくCloudBlobContainerのオブジェクトを戻してください。 GetSaSForBlobContainerを更新し、CloudBlockBlobの代わりにCloudBlobContainerタイプの第1パラメータを使用してください。これらの変更を行うと、あなたはあなたが得ている403のエラーを取得すべきではありません。

関連する問題