0

J'ai créé une application Xamarin UWP à l'aide d'applications Azure Mobile et j'essaie de télécharger un stockage BLOB vers Azure avec un jeton SAS et le client .Net Azure Storage (8.4.0). Je suis capable de générer le jeton SAS pour mon conteneur via une fonction Easy API Node mais lorsque j'essaie de l'utiliser pour télécharger le fichier, j'obtiens une erreur "Le serveur n'a pas réussi à authentifier la requête. formé correctement, y compris la signature "Impossible de télécharger BLOB avec SAS Token

code API facile. pour GetUploadToken

var azure = require('azure-storage'); 

function generateSasToken(container, blobName, permissions) { 
    var connString = "<conn string from azure storage acct>"; // removed for StackOverflow question 
    var blobService = azure.createBlobService(connString); 

    var currentDate = new Date(); 
    var startDate = new Date(currentDate); 
    startDate.setMinutes(currentDate.getMinutes() - 5); 

    console.log("startDate: " + startDate); 

    console.log("current date: " + currentDate); 

    var expiryDate = new Date(currentDate); 
    expiryDate.setMinutes(currentDate.getMinutes() + 60); 

    console.log("expiryDate: " + expiryDate);  

    permissions = permissions || azure.BlobUtilities.SharedAccessPermissions.READ; 

    var sharedAccessPolicy = { 
     AccessPolicy: { 
      Permissions: permissions, 
      Start: startDate, 
      Expiry: expiryDate 
     } 
    }; 

    var sasToken = blobService.generateSharedAccessSignature(container, blobName, sharedAccessPolicy); 

    console.log("SAS Token: " + sasToken); 
    return { 
     token: sasToken, 
     uri: blobService.getUrl(container, blobName, sasToken) 
    }; 
} 

module.exports = { 
    "post": function (req, res, next) { 
     if (req.body.Container) { 
      console.log("Container: " + req.body.Container); 
      console.log("BlobName:" + req.body.BlobName); 
      console.log("Permissions:" + req.body.Permissions); 

      // The following values can be used for permissions: 
      // "a" (Add), "r" (Read), "w" (Write), "d" (Delete), "l" (List) 
      // Concatenate multiple permissions, such as "rwa" = Read, Write, Add 
      var token = generateSasToken(req.body.Container, req.body.BlobName, req.body.Permissions); 

      res.status(200).type('application/json').json(token); 
     } else { 
      res.status(400).type("text/plain").text("Specify a value for 'container"); 
     } 
    } 
}; 

API facile sortie

Container: sketches 
BlobName:DSCF3726.JPG 
Permissions:rwa 
startDate: Thu Oct 05 2017 14:39:36 GMT+0000 (Coordinated Universal Time) 
current date: Thu Oct 05 2017 14:44:36 GMT+0000 (Coordinated Universal Time) 
expiryDate: Thu Oct 05 2017 15:44:36 GMT+0000 (Coordinated Universal Time) 
SAS Token: st=2017-10-05T14%3A39%3A36Z&se=2017-10-05T15%3A44%3A36Z&sp=rwa&sv=2017-04-17&sr=b&sig=... 

Ajouter code

internal async Task<string> UploadAsync(string fileName, byte[] dataArray) 
{ 
    var sketchFile = new SketchFile 
    { 
     BlobName = fileName, 
     Container = "sketches", 
     Permissions = "rwa" 
    }; 

    var response = await CurrentClient.InvokeApiAsync<SketchFile, GetSasTokenResponse>(
     "GetUploadToken", 
     sketchFile); 

    try 
    { 
     var blob = new CloudBlockBlob(new Uri(response.Uri)); 

     await blob.UploadFromByteArrayAsync(dataArray, 0, dataArray.Length); 
    } 
    catch (StorageException se) 
    { 
     System.Diagnostics.Debug.WriteLine($"Error uploading {fileName}: {se.RequestInformation.ExtendedErrorInformation.ErrorMessage}."); 

     return null; 
    } 

    var uri = response.Uri.Substring(0, response.Uri.IndexOf('?')); 

    return uri; 
} 

Répondre

1

En fonction de votre code, je pourrais reproduire ce problème de mon côté. Je suppose qu'il peut provenir du Permissions que vous avez spécifié. Comme Permissions for a blob états sur l'autorisation Add comme suit:

opérations autorisées: Ajouter un bloc à un blob append.

Vous pouvez utiliser Azure Storage Explorer et générer les sas jeton pour votre blob de bloc pour réduire ce problème.

Par mon test, modifiez le Autorisations à rw, puis j'ai réussi à télécharger mon fichier à Azure blob de stockage.

+0

C'était tout! Merci! –