shareSasBuilder не работает, если имя файла содержит специальные символы

Мне нужно разрешить пользователям загружать определенные файлы, хранящиеся в общей папке Azure. Он работает нормально, если имя файла не содержит специальных символов, но выдает ошибку AuthenticationFailed, если оно содержит какие-либо специальные символы (например, пробел).

<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:19654741-801a-0014-1b04-9197c9000000 Time:2020-09-22T17:20:44.1980779Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was r 2020-09-22T19:20:42Z /file/depotsracq/cegep/BA/ZOOM 2.pdf 2019-07-07
</AuthenticationErrorDetail>
</Error>

Вот метод, который возвращает Uri. Я почти уверен, что это связано с кодировкой специальных символов. В ShareSasBuilder я передаю имя файла без кодировки (file.Path), но URL-адрес требует кодирования специальных символов. Я предполагаю, что Azure ожидает, что специальные символы будут закодированы по-другому.

    public Uri getFileUri(string filePath)
    {
        ShareDirectoryClient directory = shareClient.GetDirectoryClient(Path.GetDirectoryName(filePath));
        ShareFileClient file = directory.GetFileClient(Path.GetFileName(filePath));

        if (file.Exists())
        {
            var shareSasBuilder = new ShareSasBuilder
            {
                ShareName = directory.ShareName,
                FilePath = file.Path,
                ExpiresOn = DateTime.UtcNow.AddHours(+2)
            };

            shareSasBuilder.SetPermissions(ShareFileSasPermissions.Read);

            SasQueryParameters sasQueryParameters = shareSasBuilder.ToSasQueryParameters(sharedKeyCredential);

            UriBuilder fullUri = new UriBuilder(file.Uri)
            { 
                 Query = sasQueryParameters.ToString()
            };

            return fullUri.Uri;
        }
        else
        {
            return null;
        }
    }

person Guillaume Filion    schedule 22.09.2020    source источник
comment
Если я закомментирую строку FilePath = file.Path, она работает нормально. Доказательство того, что это связано с именем файла. Однако мне нужно ограничить разрешение для определенного файла.   -  person Guillaume Filion    schedule 22.09.2020


Ответы (1)


Убедитесь, что вы используете последнюю версию пакета общего доступа к файлам Azure: Azure .Storage.Files.Shares, версия 12.4.0.

Я протестировал его на своей стороне с именем файла, содержащим специальные символы, такие как white-space или @ и т. д. Он возвращает действительный URL-адрес с sastoken, и его можно использовать для успешного доступа к файлу. Пример кода ниже:

       string conn_str = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xx;EndpointSuffix=core.windows.net";
        
        var sharedKeyCredential = new StorageSharedKeyCredential("xxx", "xxx");

        ShareServiceClient client = new ShareServiceClient(conn_str);
        var shareClient = client.GetShareClient("aaa");

        ShareDirectoryClient directory = shareClient.GetDirectoryClient("bbb");

        //use file name contains special chars like @
        ShareFileClient file = directory.GetFileClient("foo@@.txt");

        //or use the file name contains white-space
        //ShareFileClient file = directory.GetFileClient("foo test.txt");

        if (file.Exists())
        {
            var shareSasBuilder = new ShareSasBuilder
            {
                ShareName = directory.ShareName,
                FilePath = file.Path,
                ExpiresOn = DateTime.UtcNow.AddHours(+2)
            };

            shareSasBuilder.SetPermissions(ShareFileSasPermissions.Read);

            SasQueryParameters sasQueryParameters = shareSasBuilder.ToSasQueryParameters(sharedKeyCredential);

            UriBuilder fullUri = new UriBuilder(file.Uri)
            {
                Query = sasQueryParameters.ToString()
            };

            return fullUri.Uri;
        }

Пожалуйста, дайте мне знать, если у вас все еще есть какие-либо проблемы.

person Ivan Yang    schedule 23.09.2020
comment
Оно работает! Я обновился с 12.2.1 до 12.4.0, и это решило проблему. Большое спасибо! - person Guillaume Filion; 23.09.2020