使用共享访问签名的Azure Blob存储虚拟目录

时间:2016-08-15 13:50:51

标签: azure azure-storage azure-storage-blobs

我无法获得共享访问策略来处理blob存储中的虚拟目录。它适用于容器。据我所知,虚拟目录是容器,所以SAS应该工作吗?

当我尝试使用SAS访问虚拟目录中的资源时,我得到了这个回复:

<?xml version="1.0" encoding="utf-8"?>
<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:XXXXXXXX-000X-00XX-XXXX-XXXXXX000000 Time:2016-08-15T13:28:57.6925768Z</Message>
    <AuthenticationErrorDetail>Signature did not match. String to sign used was r 2016-08-15T13:29:53Z /blob/xxxxxxxxxx/mycontainer 2015-12-11</AuthenticationErrorDetail>
</Error>

示例代码:

public static async Task<string> GetFilePath()
{
    var storageAccount = CloudStorageAccount.Parse( "DefaultEndpointsProtocol=https;AccountName=xxxxxxxxxx;AccountKey=xxxxxxxxxx" );
    var blobClient = storageAccount.CreateCloudBlobClient();

    var containerName = "mycontainer/myvd";     // remove /myvd and SAS will work fine
    var containerReference = blobClient.GetContainerReference( containerName );

    var blobName = "readme.txt";
    var blobReference = await containerReference.GetBlobReferenceFromServerAsync( blobName );

    var sasConstraints = new SharedAccessBlobPolicy();

    sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes( 1 );
    sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

    var sasContainerToken = containerReference.GetSharedAccessSignature( sasConstraints );

    var path = $"{blobClient.BaseUri.ToString()}{containerName}/{blobName}{sasContainerToken}";

    return path;
}

1 个答案:

答案 0 :(得分:1)

此错误的原因是因为DataGridRow仅在blob容器级别或blob级别受支持。事实上,在Azure Blob存储中,没有https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&type=restaurant&name=cruise&key=YOUR_API_KEY 这样的东西;它只支持2级层次结构:Blob Container&amp;斑点。 Shared Access Signatures只是您应用于文件(blob)名称的前缀。

基于此,我建议您对代码进行以下更改:

Virtual Directory