web-dev-qa-db-ja.com

Azure共有アクセス署名-署名が一致しませんでした

私はこのエラーを受け取ります:

<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を試しても、実際には違いはありませんが、ちょっと….

どんな提案も大歓迎です:-)

20
wallismark

短い答え:

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仕様に従って必要です。

33
Gaurav Mantri

@Gaurav Mantri Answerに追加して、権限を再確認するために、OWN SAS Azureポータルでトークンを作成することもできます。

enter image description here

これから、これを関連付けることができますcomp=list&restype=container

提供できるリソースタイプ:

  1. 容器
  2. オブジェクト
  3. サービス

これが誰かに役立つことを願っています...

1
Jayendran

これに多くの時間を費やした後、実際のエラーは.netコンパイラによって発生した例外とは異なります。 blobファイルをストレージにアップロードするときにメタデータフィールドを使用している場合は、メタデータ文字を確認してください。たとえば、説明、ファイル名などのメタデータフィールドを追加しています...説明フィールドには、実行時に文字列テキストビューアで見つかったジャンク文字がいくつかあります。

私の説明>最初に「テストファイルの説明」、「テストファイルの説明」の説明を変更した後。正常に動作しています。

私がさまざまなソースから抽出したメタデータ値は、なぜそのジャンクキャラクターになったのかを示しています。メタデータの値を削除/修正してください。正常に機能します。

0
Muni Chittem