当文件名有特殊字符时,shareSasBuilder 不起作用
shareSasBuilder doesn't work when filename has special characters
我需要允许用户下载存储在 Azure 文件共享上的特定文件。只要文件名不包含特殊字符,它就可以正常工作,但如果它包含任何特殊字符(例如 space),则会失败并出现 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>
这是 returns 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;
}
}
请确保您使用的是最新版本的 Azure 文件共享包:Azure.Storage.Files.Shares, version 12.4.0。
我在我这边测试过它,文件名包含特殊字符,如 white-space
或 @
等。它 returns 一个有效的 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;
}
如果您还有任何问题,请告诉我。
我需要允许用户下载存储在 Azure 文件共享上的特定文件。只要文件名不包含特殊字符,它就可以正常工作,但如果它包含任何特殊字符(例如 space),则会失败并出现 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>
这是 returns 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;
}
}
请确保您使用的是最新版本的 Azure 文件共享包:Azure.Storage.Files.Shares, version 12.4.0。
我在我这边测试过它,文件名包含特殊字符,如 white-space
或 @
等。它 returns 一个有效的 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;
}
如果您还有任何问题,请告诉我。