我们正在应用程序中实现一个文件存储,我们将所有文件存储在Azure Blob存储中的私有容器中.我们有一个虚拟文件夹系统,我们在Blob存储中复制它.
例如,假设我为Company A
工作,我将file_1.txt
上传到Folder #1
,它将驻留在Blob存储中的/vault/Company A/Folder #1/file_1.txt
中.
我们使用以下代码生成SAS令牌:
public static Uri GetServiceSasUriForCloudBlockBlob(CloudBlockBlob cloudBlockBlob, string permissions = "r")
{
var sasBuilder = new SharedAccessBlobPolicy()
{
SharedAccessStartTime = DateTimeOffset.UtcNow.AddMinutes(-5),
SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(5),
Permissions = SharedAccessBlobPolicy.PermissionsFromString(permissions)
};
var sasUri = cloudBlockBlob.GetSharedAccessSignature(sasBuilder);
return new Uri(cloudBlockBlob.Uri + sasUri);
}
然而,这不起作用.我们得到的错误是:
<Error>
<script type="text/javascript"/>
<Code>AuthenticationFailed</Code>
<Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:f82118d1-101e-002a-1381-97ac16000000 Time:2022-07-14T12:55:34.6370028Z</Message>
<AuthenticationErrorDetail>Signature did not match. String to sign used was r 2022-07-14T12:50:27Z 2022-07-14T13:00:27Z /blob/[blobname]/vault/Company A/Folder #1/file_1.txt 2019-07-07 b </AuthenticationErrorDetail>
</Error>
从Azure门户或Azure Storage Explorer生成SAS令牌时,没有问题
Blob中文件路径中的特殊字符似乎有问题.因此,我们try 手动转义所有空格和特殊字符以解决此问题,但在执行此操作时,CloudBlockBlob会再次对其进行编码(例如:转义My%20File.txt
到My%2520File.txt
).
目前我们使用的唯一操作是在对象上读取,但这可能会在将来扩展.
我们可以禁止在文件夹/文件中使用空格和特殊字符,但这并不是解决问题,而是解决问题.在不实施命名策略的情况下,我们如何解决这个问题?
事实证明,这是一个设计问题,虽然SDK文档从未明确禁止使用未替换的blob路径,但它确实不允许容器名称使用字母数字和破折号以外的任何名称.