web-dev-qa-db-ja.com

紺碧のblobは、正しいアクセスキーで禁止されている403を返します

私のテストサイトでは、デプロイが開始された後、AzureBLOBストレージからファイルにアクセスしようとしたときに403が禁止されました。これはテスト環境での問題にすぎません。新しいリリースは本番環境で問題なく動作します。本番環境とテスト環境はどちらもAzureでホストされており、どちらも独自のAzureBLOBストレージを使用しています。

運が悪かったので、BLOBストレージのアクセスキーを再生成しようとしました。
アクセスキーをローカルで使用して、テストBLOBストレージに接続し、ファイルに問題なくアクセスできます。
本番BLOBストレージを使用するようにテスト環境を変更しようとすると、403forbiddenエラーが発生します。

Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (403) Forbidden. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden. at System.Net.HttpWebRequest.GetResponse() at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 cmd、IRetryPolicyポリシー、OperationContext operationContext)in c:\ Program Files(x86)\ Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executiveor\Executor.cs:line 677 ---終了内部例外スタックトレース--- Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T](RESTCommand1 cmd、IRetryPolicyポリシー、OperationContext operationContext)のc:\ Program Files(x86)\ Jenkins\workspace\release_dotnet_master\c:\ Program Files(x86)\ JenkinsのMicrosoft.WindowsAzure.Storage.Blob.CloudBlobClient.GetBlobReferenceFromServer(StorageUri blobUri、AccessCondition accessCondition、BlobRequestOptions options、OperationContext operationContext)のLib\ClassLibraryCommon\Core\Executor\Executor.cs:line 604\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlobClient.cs:line 563 at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.GetBlobReferenceFromServer(String blobName、AccessCondition accessCondition、BlobRequestOptions options、Ope rationContext operationContext)in c:\ Program Files(x86)\ Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlobContainer.cs:line 818 at ASP.XYZ in d:\ XYZ.cshtml:line 27 Request Information RequestID:fc137321 -0001-00ce-02d2-de5736000000 RequestDate:Tue、06 Jun 2017 14:41:21 GMT StatusMessage:Serverはリクエストの認証に失敗しました。署名を含め、Authorizationヘッダーの値が正しく形成されていることを確認してください。

これは、テストサイトを実行するAzureアプリサービスの問題である必要があります。私はそれが何であるかを見ることができません。

非常に単純化されたコードについては、ここの要点を参照してください https://Gist.github.com/Skaanning/5cddf95a0d1ff210482d99a683e0be9c

編集他に複数のblobストアがありますが、テストサイトではどれも機能しません。ただし、他の環境では正常に機能します。

8
Misk

var img = container.GetBlobReference( "someimage.png"); //これは問題なく動作します
var img2 = container.GetBlobReferenceFromServer( "someimage.png"); //これは403をスローします

最初の行は正常に機能します。その理由は、GetBlobReferenceメソッドを実行するときにサーバーにリクエストを送信しないためです。 GetBlobReferenceFromServerメソッドを実行すると、blobコンテンツを取得するためのリクエストがサーバーに送信されます。 BLOBサーバーでBLOBが見つからない場合は、404 notfound例外がスローされます。

私のテストサイトでは、デプロイが開始された後、AzureBLOBストレージからファイルにアクセスしようとしたときに403が禁止されました。

間違ったアクセスキーによって引き起こされることが多い403禁止例外が使用されます。テスト環境で使用した接続文字列を印刷してください。

Trace.Write(CloudConfigurationManager.GetSetting("blob.storage"));

Azure Storage接続文字列は、次の形式を使用します。接続文字列に正しいアカウント名とキーペアを指定したことを確認してください。アカウント名1とアカウント名2のアカウントキーを設定すると、例外が発生します。

DefaultEndpointsProtocol=https;AccountName=[accountName];AccountKey=[accountKey];EndpointSuffix=core.windows.net

この問題の原因となるもう1つの理由は、ストレージサーバーへの要求がテストサーバーによって拒否されることです。 web.configで 動的IPセキュリティ を構成したかどうかを確認してください。

2017/6/7 4:26 PMを編集

私はあなたが私の上の提案を取ることをお勧めします。実行時に接続文字列を印刷してください。 Azureポータルのアプリ設定とweb.configの両方で接続文字列を設定した場合。 Azureポータルの設定は、web.configの設定を上書きします。

また、実行時に現在の日時を印刷して、アプリインスタンスのシステム時刻が正しいかどうかを確認してください。システムの日付または時刻が変更された場合、404Forbiddenも発生します。

ストレージサービスは、リクエストがサービスに到達するまでに15分以内であることを保証します。これは、リプレイ攻撃を含む特定のセキュリティ攻撃から保護します。このチェックが失敗すると、サーバーは応答コード403(禁止)を返します。

参照: Azure Storage Servicesの認証

2017/6/7 5:55 PMを編集

リリースをデプロイするときに、テストサーバーですべての元のファイルを削除しようとしましたか?

enter image description here

5
Amor

サーバーの日時を確認します。それは私のために働いた。

3
Bruno Leitão

サーバー時間が間違っていました。アプリケーションが時間を1時間20分に戻したため、403になりました。Azureblobstorageからの承認では、認証にサーバー時間が使用されていると推測しています。

少なくとも時間を修正に戻すことは私にとってはうまくいきました。

1

2つのアクセスキーのもう1つを試しましたが、機能しました。

0
Andybanandy

これと同じエラーが発生しました。エラーを修正したのは、プラットフォームを任意のCPUからx64に切り替えることだけでした。これは何のvoodoですか?

次に、「任意のCPU」に戻し、Visual Studioから再構築またはクリーンアップを使用する代わりに、今回はすべてのローカルファイルを手動で削除しました。クリーンから再構築されたため、403は入手できなくなりました。

0
Aaron