ShareSasBuilder 生成无效签名

ShareSasBuilder generating an invalid signature

我正在尝试生成一个 SAS 签名 URL 以从 Azure 文件存储下载文件 (using this as an example):

using Azure.Storage;
using Azure.Storage.Files.Shares;
using Azure.Storage.Files.Shares.Models;
using Azure.Storage.Sas;
(...)

public Uri getFileUri(string fileName)
{
string AccountName = WebConfigurationManager.AppSettings["AzureStorageDepotAccountName"];
string AccountKey = WebConfigurationManager.AppSettings["AzureStorageDepotAccountKey"];
sharedKeyCredential = new StorageSharedKeyCredential(AccountName, AccountKey);
shareClient = new ShareClient(new Uri("https://sanitizedShare.file.core.windows.net/"), sharedKeyCredential);

ShareDirectoryClient directory = shareClient.GetDirectoryClient("sanitizedDir");
ShareFileClient file = directory.GetFileClient(fileName);

var shareSasBuilder = new ShareSasBuilder
{
    ShareName = "sanitizedShare",
    FilePath = file.Uri.LocalPath,
    Protocol = SasProtocol.None,
    StartsOn = DateTime.UtcNow.AddHours(-1),
    ExpiresOn = DateTime.UtcNow.AddHours(+2),
    IPRange = new SasIPRange(IPAddress.None, IPAddress.None)
};

shareSasBuilder.SetPermissions(ShareFileSasPermissions.Read);

return new Uri(file.Uri + "?" + shareSasBuilder.ToSasQueryParameters(sharedKeyCredential).ToString());
}

它 returns 看起来是正确的 URL (https://sanitizedShare.file.core.windows.net/sanitizedDir/sanitizedFile?sv=2019-07-07&st=2020-05-27T19:36:55Z&se=2020-05-27T22:36:55Z&sr=f&sp=r&sig=l3bLiYlA9Y+Se1jC1g/F5A0T4yOT0nUJHUxyLhNksw8=) 但是当我尝试它时我得到这个错误:

<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:8c400781-e01a-0040-4266-347d43000000 Time:2020-05-27T20:36:56.2303652Z
</Message>
<AuthenticationErrorDetail>Signature fields not well formed.</AuthenticationErrorDetail>
</Error>

起初我以为我的凭据有误,但我在代码的其他地方使用了相同的凭据并且它可以访问共享。您知道问题出在哪里吗?

对您的代码进行以下更改:

1.add在url的末尾file share name创建ShareClient(注意:对于url,我看到你用的是 fileshareName.file.core.windows.net,应该是 your_storage_account_name.file.core.windows.net),如下所示:

var shareClient = new ShareClient(new Uri("https://your_storage_account_name.file.core.windows.net/the_share_name"), sharedKeyCredential);

2.innew ShareSasBuilder{}的代码块,去掉FilePath = file.Uri.LocalPath,

然后我测试了代码(使用最新版本的 Azure.Storage.Files.Shares 12.2.1),它使用 sastoken 生成了有效且有效的 url。我的代码如下:

        string storageAccount= "yy1";
        string password = "xxxx";

        var sharedKeyCredential = new StorageSharedKeyCredential(storageAccount, password);

        //the file share name is aaa
        var shareClient = new ShareClient(new Uri("https://yy1.file.core.windows.net/aaa"), sharedKeyCredential);

        ShareDirectoryClient directory = shareClient.GetDirectoryClient("a11");
        ShareFileClient file = directory.GetFileClient("1.txt");

        var shareSasBuilder = new ShareSasBuilder
        {
            ShareName = "aaa",
            //FilePath = file.Uri.LocalPath,
            Protocol = SasProtocol.None,
            StartsOn = DateTime.UtcNow.AddHours(-1),
            ExpiresOn = DateTime.UtcNow.AddHours(+2),
            IPRange = new SasIPRange(IPAddress.None, IPAddress.None)
        };

        shareSasBuilder.SetPermissions(ShareFileSasPermissions.Read);

        var url = new Uri(file.Uri + "?" + shareSasBuilder.ToSasQueryParameters(sharedKeyCredential).ToString());