在 c# 中的私有访问下无法下载 azure 存储 blob
Trouble downloading azure storage blobs under private access in c#
我完全是 c# 的菜鸟,对 azure api 知之甚少,而且我现在是一名 CS 学生,正在为工作做一个项目。我使用 youtube 教程构建了一些中间件,这些中间件使用字符串连接对存储帐户进行身份验证,并枚举、上传、下载和删除容器中的 blob。我遇到的问题仅在于下载功能,并且仅当存储帐户访问权限设置为私有时。此功能适用于匿名访问。我怀疑问题出在附加 url 上,我不确定如何解决它。如果重要的话,blob 主要是 csv 数据。任何对资源的帮助或指导将不胜感激,这里是相关代码:
url 函数
public async Task<string> GetBlob(string name, string containerName)
{
var containerClient = _blobClient.GetBlobContainerClient(containerName);
var blobClient = containerClient.GetBlobClient(name);
return blobClient.Uri.AbsoluteUri;
}
配置文件
"AllowedHosts": "*",
"BlobConnection" : "<mystringconnection>******==;EndpointSuffix=core.windows.net"
操作请求
[HttpGet]
public async Task<IActionResult> ViewFile(string name)
{
var res = await _blobService.GetBlob(name, "<mystorageacc>");
return Redirect(res);
}
如果要从blob服务下载;
public async Task<byte[]> ReadFileAsync(string path)
{
using var ms = new MemoryStream();
var blob = _client.GetBlobClient(path);
await blob.DownloadToAsync(ms);
return ms.ToArray();
}
如果你想从控制器下载文件字节数组,你可以勾选这个;
如果要设置blob文件public访问级别;
https://docs.microsoft.com/en-us/azure/storage/blobs/anonymous-read-access-configure.
请注意图片;
或者您可以连接Azure Storage Explorer并选择简单的方式。
我在 Google 上找到了图片,可能会有差异。 :)
您无法从私有容器下载 blob 的原因是您只是从您的方法中返回 blob 的 URL 而没有任何授权信息。必须授权访问私有容器中的 blob。
您需要做的是创建一个 Shared Access Signature (SAS)
with at least Read
permission and then return that SAS URL. The method you would want to use is GenerateSasUri
。您的代码类似于:
public async Task<string> GetBlob(string name, string containerName)
{
var containerClient = _blobClient.GetBlobContainerClient(containerName);
var blobClient = containerClient.GetBlobClient(name);
return blobClient.GenerateSasUri(BlobSasPermissions.Read, DateTime.UtcNow.AddMinutes(5)).Uri.AbsoluteUri;
}
这将为您提供一个 link,自创建之日起 5 分钟内有效,并具有读取(下载)blob 的权限。
我完全是 c# 的菜鸟,对 azure api 知之甚少,而且我现在是一名 CS 学生,正在为工作做一个项目。我使用 youtube 教程构建了一些中间件,这些中间件使用字符串连接对存储帐户进行身份验证,并枚举、上传、下载和删除容器中的 blob。我遇到的问题仅在于下载功能,并且仅当存储帐户访问权限设置为私有时。此功能适用于匿名访问。我怀疑问题出在附加 url 上,我不确定如何解决它。如果重要的话,blob 主要是 csv 数据。任何对资源的帮助或指导将不胜感激,这里是相关代码:
url 函数
public async Task<string> GetBlob(string name, string containerName)
{
var containerClient = _blobClient.GetBlobContainerClient(containerName);
var blobClient = containerClient.GetBlobClient(name);
return blobClient.Uri.AbsoluteUri;
}
配置文件
"AllowedHosts": "*",
"BlobConnection" : "<mystringconnection>******==;EndpointSuffix=core.windows.net"
操作请求
[HttpGet]
public async Task<IActionResult> ViewFile(string name)
{
var res = await _blobService.GetBlob(name, "<mystorageacc>");
return Redirect(res);
}
如果要从blob服务下载;
public async Task<byte[]> ReadFileAsync(string path)
{
using var ms = new MemoryStream();
var blob = _client.GetBlobClient(path);
await blob.DownloadToAsync(ms);
return ms.ToArray();
}
如果你想从控制器下载文件字节数组,你可以勾选这个;
如果要设置blob文件public访问级别; https://docs.microsoft.com/en-us/azure/storage/blobs/anonymous-read-access-configure.
请注意图片;
或者您可以连接Azure Storage Explorer并选择简单的方式。
我在 Google 上找到了图片,可能会有差异。 :)
您无法从私有容器下载 blob 的原因是您只是从您的方法中返回 blob 的 URL 而没有任何授权信息。必须授权访问私有容器中的 blob。
您需要做的是创建一个 Shared Access Signature (SAS)
with at least Read
permission and then return that SAS URL. The method you would want to use is GenerateSasUri
。您的代码类似于:
public async Task<string> GetBlob(string name, string containerName)
{
var containerClient = _blobClient.GetBlobContainerClient(containerName);
var blobClient = containerClient.GetBlobClient(name);
return blobClient.GenerateSasUri(BlobSasPermissions.Read, DateTime.UtcNow.AddMinutes(5)).Uri.AbsoluteUri;
}
这将为您提供一个 link,自创建之日起 5 分钟内有效,并具有读取(下载)blob 的权限。