ShareSasBuilder генерирует неверную подпись - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать подписанный URL-адрес SAS для загрузки файла из файлового хранилища Azure ( на примере этого) :

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

Он возвращает правильно выглядящий 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 Ответ

1 голос
/ 28 мая 2020

Внесите следующие изменения в свой код:

1. добавьте file share name в конце URL-адреса при создании ShareClient ( Примечание : для URL-адреса I видите, вы используете 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. в блоке кода new ShareSasBuilder{} удалите FilePath = file.Uri.LocalPath,

Затем я протестировал код (с последней версией Azure.Storage.Files.Shares 12.2.1), он генерирует действительный и рабочий URL-адрес с sastoken. Мой код, как показано ниже:

        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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...