【问题标题】:Unable to Get/Post Blob on Azure Storage via Rest API in C#无法通过 C# 中的 Rest API 在 Azure 存储上获取/发布 Blob
【发布时间】:2019-12-31 14:20:17
【问题描述】:

在 c# 代码中成功使用 Azure Rest api 后。我能够创建、获取和获取容器列表,但不能创建 blob。在访问或上传 blob 时,这会产生权限问题,即

您无权在分配的权限下执行此请求

我目前取得的进展:

  1. 能够创建和获取容器。
  2. 能够获取存储帐户的所有容器列表。

当尝试通过下面的源代码获取/放置一个 blob 时,它给了我错误:

此请求无权使用此权限执行此操作。

string endPointUri = $"{azureApplicationConfiguration.Resource}/{inpContainerName}/{inpBlobName}";
var request = (HttpWebRequest)WebRequest.Create(endPointUri);
request.Method = HTTPMethod.GET.ToString();
request.Headers.Add("Authorization", $"Bearer  {sasToken.access_token}");
request.Headers.Add("x-ms-date", DateTime.UtcNow.ToString("R"));
request.Headers.Add("x-ms-version", "2018-03-28");
request.ProtocolVersion = HttpVersion.Version11;

using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
    Console.WriteLine(resp.StatusCode.ToString());
    Console.ReadKey();
}

【问题讨论】:

    标签: azure rest api blob storage


    【解决方案1】:

    最可能的答案是您用来进行身份验证的 SAS 令牌不支持对象级访问。您可以通过检查 SAS 令牌中的 Signed Resource Types srt= 参数中是否有字母 o 来确认这一点。基于您可以列出和创建容器的事实,我猜当前值是srt=sc。为了也能够对 blob 执行 GET/PUT 操作,您需要生成一个包含对象级权限的新 SAS 令牌,它应该会为您提供一个包含 srt=sco 的令牌。


    如果您还不知道,有一个.NET Azure Storage SDK 可用,它在 REST API 之上提供了一个抽象层,从长远来看可能会为您节省一些时间。

    【讨论】:

    • 除了我的问题,这里我一直在生成 AAD 令牌来验证所有与 Azure Blob 相关的事务。
    • @SachinSharma 您的用户/组/应用程序服务主体是否拥有Storage Blob Data Contributor 权限?
    • 是的,我的服务主体已添加到所有者 l 中的存储帐户中。
    • 使用 Azure Active Directory (AAD) 令牌,我可以毫无问题地创建和检索容器。但是出于同样的原因,由于某种奇怪的原因,我无法上传和检索 blob。这告诉我一些权限问题,说明错误详细信息“您无权使用分配的权限执行此请求”。
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多