私はこのエラーを受け取ります:
<Error>
<Code>AuthenticationFailed</Code>
<Message>
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:6c3fc9a8-cdf6-4874-a141-10282b709022 Time:2014-07-30T10:48:43.8634735Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was rwl 2014-07-31T04:48:20Z /acoustie/$root 2014-02-14
</AuthenticationErrorDetail>
</Error>
Sas(共有アクセス署名)を生成し、それをコンテナーuriの末尾に貼り付けてブラウザーに貼り付けたときに取得されます。これは、生成されたsasの完全なアドレスです。
https://acoustie.blob.core.windows.net/mark?sv=2014-02-14&sr=c&sig=E6w%2B3B8bAXK8Lhvvr62exec5blSxsA62aSWAg7rmX4g%3D&se=2014-07-30T13%3A30%3A14Z&sp=rwl
私はSOとGoogleを精査し、多くの組み合わせを試しましたが、すべてが正しく行われていることがわかる限り、私はそうではないことを知っていますが、それを見ることができません。 ..本当に誰かが助けてくれることを願っています:-\
明確にするために、私は特定のblobやルートコンテナーではなく、コンテナーでsasを生成しています。 BLOBへのアクセスは、パブリックBLOBとして定義されます。私の最終目標は、sasを使用してコンテナーへの書き込みを許可することですが、「デバッグ」では、SharedAccessBlobPolicyにほとんどの権限を追加しました。
コンテナ名の beginning and ending に\を追加してみました。変化なし。
これは、私がsasを生成するために使用するコードです。
var blobClient = storageAccount.CreateCloudBlobClient();
//Get a reference to the blob container
var container = blobClient.GetContainerReference(containerName);
// Do not set start time so the sas becomes valid immediately.
var sasConstraints = new SharedAccessBlobPolicy
{
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(30),
Permissions = SharedAccessBlobPermissions.Write
| SharedAccessBlobPermissions.Read
| SharedAccessBlobPermissions.List,
};
var sasContainerToken = container.GetSharedAccessSignature(sasConstraints);
//Return the URI string for the container, including the SAS token.
var sas = string.Format("{0}{1}", container.Uri.AbsoluteUri, sasContainerToken);
Logger.Debug("SAS: {0}", sas);
return sas;
署名を生成しますが、有効な署名ではないようです。
別のコンテナーを試して、アクセスポリシーを変更しました。開始時間の有無にかかわらず、有効期限を今から12時間以上に延長しました(UTC + 10タイムゾーンです)、何を変更しても問題ないようです。同じ「署名が一致しませんでした」というエラーが発生します。
古いバージョンの「WindowsAzure.Storage」を使用してみたので、4.2と4.1を試しました。別のブラウザーでURIを試しても、実際には違いはありませんが、ちょっと….
どんな提案も大歓迎です:-)
短い答え:
SAS URLにcomp=list&restype=container
を追加すると、このエラーは発生しません。
長い答え:
基本的に、SAS URLから、Azure Storage Serviceは、アクセスしようとしているリソースがBLOBであるかコンテナーであるかを識別できず、BLOBであると想定します。リソースタイプを想定しているため、 blobである場合、これは$root
blobコンテナーをSAS計算に使用します(これはエラーメッセージから確認できます)。SASが計算されたため、 mark
blobコンテナの場合、このSignature Does Not Match
エラーが発生します。restype=container
を指定すると、リソースをcontainer
として扱うようストレージサービスに指示します。comp=list
REST API仕様に従って必要です。
これに多くの時間を費やした後、実際のエラーは.netコンパイラによって発生した例外とは異なります。 blobファイルをストレージにアップロードするときにメタデータフィールドを使用している場合は、メタデータ文字を確認してください。たとえば、説明、ファイル名などのメタデータフィールドを追加しています...説明フィールドには、実行時に文字列テキストビューアで見つかったジャンク文字がいくつかあります。
私の説明>最初に「テストファイルの説明」、「テストファイルの説明」の説明を変更した後。正常に動作しています。
私がさまざまなソースから抽出したメタデータ値は、なぜそのジャンクキャラクターになったのかを示しています。メタデータの値を削除/修正してください。正常に機能します。