web-dev-qa-db-fra.com

Signature Azure Shared Access - La signature ne correspond pas

Je reçois cette erreur:

<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>

Je l'obtiens quand je génère un sas (signature d'accès partagée) puis le colle à la fin du conteneur uri dans un navigateur. C'est l'adresse complète avec les sas générés:

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

J'ai parcouru SO et Google et j'ai essayé de nombreuses combinaisons. Autant que je sache, je fais tout correctement, je sais que je ne le suis pas, je ne le vois tout simplement pas ... vraiment en espérant que quelqu'un puisse aider: - \

Pour être clair, je génère un SAS sur un conteneur, pas un blob spécifique et non sur le conteneur racine. L'accès sur le blob est défini en tant que blob public. Mon objectif final est de simplement autoriser les écritures dans le conteneur avec les sas, tout en "déboguant", j'ai ajouté la plupart des autorisations à SharedAccessBlobPolicy.

J'ai essayé d'ajouter un\au début et à la fin du nom du conteneur. Pas de changement.

C'est le code que j'utilise pour générer le 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;

Il génère une signature, cela ne semble tout simplement pas être une signature valide.

J'ai essayé différents conteneurs, en modifiant la politique d'accès, avec et sans heure de début, en prolongeant l'expiration à> 12 heures à partir de maintenant (je suis dans un fuseau horaire UTC + 10), peu importe ce que je change. résultats dans la même erreur "signature ne correspond pas".

J'ai même essayé d'utiliser une ancienne version de 'WindowsAzure.Storage', j'ai donc maintenant essayé les versions 4.2 et 4.1. Même essayé le uri dans un navigateur différent, ne devrait vraiment pas faire la différence mais bon….

Toutes les suggestions sont grandement appréciées :-)

13
wallismark

Réponse courte:

Ajoutez comp=list&restype=container à votre URL SAS et vous ne devriez pas recevoir cette erreur.

Longue réponse:

Essentiellement, à partir de votre URL SAS, Azure Storage Service n'est pas en mesure d'identifier si la ressource à laquelle vous essayez d'accéder est un objet blob ou un conteneur et suppose qu'il s'agit d'un objet blob. Puisqu'il suppose que le type de ressource est blob, il utilise le conteneur de blob $root pour le calcul SAS (que vous pouvez voir à partir de votre message d'erreur). Puisque SAS a été calculé pour le conteneur d'objets blob mark, vous obtenez l'erreur Signature Does Not Match. En spécifiant restype=container, vous indiquez au service de stockage de traiter la ressource comme suit: container. comp=list est requis conformément à la spécification d'API REST.

29
Gaurav Mantri

En ajoutant à @Gaurav Mantri Answer, afin de vérifier les autorisations, vous pouvez également créer votre jeton OWN SAS dans le portail Azure.

 enter image description here

À partir de là, vous pouvez relier ce comp=list&restype=container

Types de ressources que vous pouvez fournir en tant que:

  1. Récipient
  2. Objet
  3. Un service

J'espère que cela aide quelqu'un ..

0
Jayendran