0

我有一個使用Azure移動應用程序構建的Xamarin UWP應用程序,我嘗試使用SAS令牌和.Net Azure存儲客戶端(8.4.0)將BLOB上載到Azure存儲。我能夠通過Easy API Node函數爲我的容器生成SAS令牌,但是當我嘗試使用它來上傳文件時,出現錯誤「服務器未能驗證請求。請確保授權頭的值爲形成正確包括簽名無法上傳帶有SAS令牌的BLOB

簡單API代碼:爲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輸出

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

上傳代碼

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引起的。由於Permissions for a blob聲明的Add權限如下:

允許的操作:將塊添加到追加blob。

您可以使用Azure Storage Explorer併爲您的塊blob生成sas令牌以縮小此問題。

根據我的測試,將權限更改爲rw,然後我可以成功將我的文件上傳到azure blob存儲。

+0

就是這樣!謝謝! –