0

Azure Mobile Appsを使用して作成されたXamarin UWPアプリがあり、SASトークンと.Net Azure Storageクライアント(8.4.0)を使用してBLOBをAzureストレージにアップロードしようとしています。 Easy API Node機能を使用してコンテナのSASトークンを生成することはできますが、ファイルをアップロードするときにエラーが発生します。「サーバが要求を認証できませんでした。署名を含む正しく形成SASトークンでBLOBをアップロードできません

簡単にAPIコード:

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

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=... 
GetUploadTokenのためにあなたのコードに基づいて10

アップロードコード

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

答えて

1

は、私は私の側にこの問題を再現することができます。あなたが指定したPermissionsによって引き起こされたと思われました。

可操作:Add許可についてPermissions for a blob状態は以下のように追記ブロブにブロックを追加します。

Azure Storage Explorerを使用して、この問題を絞り込むブロックBLOBのsasトークンを生成できます。

私のテストでは、許可をからrwに変更すると、ファイルを空のBLOBストレージに正常にアップロードできました。

+0

それでした!ありがとう! –

関連する問題