我正在尝试生成一个URL,用户可以在其中访问Azure上的Blob存储容器中的文件。blob存储容器受到IP地址的严格限制,然后我正在构建的服务将管理请求并生成一个URL,用户可以直接访问该文件。下面是用于生成URL的代码(我认为代码本身可能没问题)。
CloudBlobContainer container = BlobStorage.GetContainer(_accountStatementEmailConfig.BlobStorageContainerName);
CloudBlockBlob blob = container.GetBlockBlobReference(document.StoragePath);
if (!blob.Exists())
{
return NotFound();
}
TimeSpan sasExpiryTime = TimeSpan.FromMinutes(_apiConfig.PresignedURLExpiryInMinutes);
SharedAccessBlobPermissions permissions = SharedAccessBlobPermissions.Read;
string sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy
{
Permissions = permissions,
SharedAccessExpiryTime = DateTime.UtcNow.Add(sasExpiryTime)
}, new SharedAccessBlobHeaders(), _apiConfig.SharedAccessSignaturePermissionsPolicyName);
string documentUrl = $"{blob.Uri.AbsoluteUri}{sasToken}";
代码生成了URL,但是当用户转到URL时,他们收到以下错误:
<Error>
<Code>AuthorizationFailure</Code>
<Message>
This request is not authorized to perform this operation. RequestId:92d7ca35-501e-0016-2a65-973659000000 Time:2023-06-01T08:43:35.2439678Z
</Message>
</Error>
这可能是我对SAS的错误假设,令牌将允许我绕过IP限制,因为我从白名单IP生成URL。是我采取了不正确的方法,还是我忽略了一些次要的东西?
1条答案
按热度按时间ne5o7dgx1#
正如Gaurav Mantri在评论中指出的那样,问题在于我对Azure如何处理权限的理解,因为我以前的所有经验都来自AWS。
在Azure中,存储帐户和容器具有单独的访问级别。通过将存储帐户设置为公共,并将每个单独的容器设置为私有,可以实现与AWS的私有+预设URL选项类似的功能。然后使用生成的SAS URL访问文件。