Мне нужно разрешить пользователям загружать определенные файлы, хранящиеся в общей папке 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;
}
}