簡體   English   中英

Azure Blob容器,無法生成令牌

[英]Azure Blob Container, Can't Generate Token

我正在研究azure存儲,但是我無法創建一個合適的SAS令牌來傳遞給我的前端javascript。 遵循多個教程和示例,我似乎無法獲得JS的工作令牌。

我在這里的教程上驗證我的令牌,這樣我自己的javascript就不會妨礙我: https//dmrelease.blob.core.windows.net/azurestoragejssample/samples/sample-blob.html

我花了幾個小時嘗試不同的解決方案,但我生成的令牌看起來與azure生成的令牌非常相似。 我錯過了什么?

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);

//Set the expiry time and permissions for the container.
//In this case no start time is specified, so the shared access signature becomes valid immediately.
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddHours(24);
sasConstraints.Permissions = SharedAccessBlobPermissions.List | SharedAccessBlobPermissions.Write;

//Generate the shared access signature on the container, setting the constraints directly on the signature.
string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

//Return the URI string for the container, including the SAS token.
return sasContainerToken;

關於這個問題,您是否嘗試使用JS來創建SAS令牌。

var azure = require('azure-storage');
var fs = require('fs');
var SasConstants = azure.Constants.AccountSasConstants;

var blobService = azure.createBlobService();

var containerName = 'containername';
var blobName = 'blobname';

var startDate = new Date('');
var expiryDate = new Date(startDate);
expiryDate.setDate(startDate.getDate() + 1);

var sharedAccessPolicy = {
  AccessPolicy: {
    Permissions: azure.BlobUtilities.SharedAccessPermissions.READ + azure.BlobUtilities.SharedAccessPermissions.ADD + azure.BlobUtilities.SharedAccessPermissions.CREATE+ azure.BlobUtilities.SharedAccessPermissions.WRITE,
    Start: startDate,
    Expiry: expiryDate
  },
};

var token = blobService.generateSharedAccessSignature(containerName, null, sharedAccessPolicy);

根據我的測試,代碼可以生成SAS令牌。 如果要列出容器中的blob,則需要將&comp=list&restype=container到SAS URL。 然后它應該工作。

Get https://xxxxx.blob.core.windows.net/test?sv=2018-03-28&sr=c&sig=xxxxxxxxx&sp=rwl&comp=list&restype=container

Azure存儲服務無法識別您嘗試訪問的資源是Blob還是容器,並假設它是blob。 由於它假定資源類型為blob,因此它使用$ root blob容器進行SAS計算(您可以從錯誤消息中看到)。 由於SAS是針對標記blob容器計算的,因此您將收到此簽名不匹配錯誤。 通過指定restype = container,您告訴存儲服務將資源視為容器。 根據REST API規范,comp = list是必需的。

有關更多信息,請參閱另一個SO線程

而是為存儲帳戶生成令牌。 列出的教程中的權限由存儲帳戶策略授予。

public static string GenerateAccountSASToken(string connectionString)
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

    SharedAccessAccountPolicy accountpolicy = new SharedAccessAccountPolicy();
    accountpolicy.SharedAccessStartTime = DateTimeOffset.UtcNow.AddHours(-24);
    accountpolicy.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddHours(24);
    accountpolicy.Permissions = SharedAccessAccountPermissions.Add | SharedAccessAccountPermissions.Create | SharedAccessAccountPermissions.List | SharedAccessAccountPermissions.ProcessMessages | SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Update | SharedAccessAccountPermissions.Write;
    accountpolicy.Services = SharedAccessAccountServices.Blob;
    accountpolicy.ResourceTypes = SharedAccessAccountResourceTypes.Container | SharedAccessAccountResourceTypes.Object | SharedAccessAccountResourceTypes.Service;
    return  storageAccount.GetSharedAccessSignature(accountpolicy);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM