【问题标题】:azure shared access signiture creation天蓝色共享访问签名创建
【发布时间】:2013-01-20 10:33:47
【问题描述】:

我正在使用 c# 为新资源创建共享访问签名(用户应具有创建权限以在我的存储帐户上创建新资源)。 MS 文档已过时,我似乎无法使用我浏览过的不同博客文章使其正常工作。

现在我的代码如下所示:

public static string GetBlobSharedAccessSignitureUrl(CloudBlobContainer container,string nameOfBlobToCreateSaSfor)
        {
            var blob = container.GetBlockBlobReference(nameOfBlobToCreateSaSfor);
            var policy = new SharedAccessBlobPolicy
                             {
                                 SharedAccessExpiryTime = DateTime.Now.AddHours(1),
                                 Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Read
                             };


            container.GetSharedAccessSignature(policy);
            string sas = blob.GetSharedAccessSignature(policy);

            return blob.Uri.AbsoluteUri + sas;

        }

返回的 url(对于我的本地机器)看起来像这样(似乎是正确的)

http://127.0.0.1:10000/devstoreaccount1/photos/photos_4.jpg?sv=2012-02-12&se=2013-01-20T10%3A13%3A17Z&sr=b&sp=rw&sig=xxx

我启动了 Azure 存储模拟器并通过 fiddler 尝试 POST 到这个 URL(也尝试了 PUT)

我收到错误(404 或 400,取决于我尝试过的此功能的不同代码)

我需要做其他事情吗? (在旧示例中​​,我看到他们事先在该位置创建了一个资源 - 我也尝试过,但也没有工作......)

Azure SDK 版本为 2.0,因此 2012 年 10 月之前的 MS 博客文章(和其他教程)已损坏(同样根据 MS 开发博客 http://blogs.msdn.com/b/windowsazurestorage/archive/2012/10/29/windows-azure-storage-client-library-2-0-breaking-changes-amp-migration-guide.aspx

任何帮助将不胜感激

【问题讨论】:

    标签: c# azure azure-blob-storage


    【解决方案1】:

    如果您通过 Fiddler 或您的代码发布,请确保添加“x-ms-blob-type”请求标头并将其值设置为“BlockBlob”。看看这个尝试上传文件的示例代码:

                    FileInfo fInfo = new FileInfo(fileName);//fileName is the full path of the file.
                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(blobSaSUrl);
                    NameValueCollection requestHeaders = new NameValueCollection();
                    requestHeaders.Add("x-ms-blob-type", "BlockBlob");
                    req.Method = "PUT";
                    req.Headers.Add(requestHeaders);
                    req.ContentLength = fInfo.Length;
                    byte[] fileContents = new byte[fInfo.Length];
                    using (FileStream fs = fInfo.OpenRead())
                    {
                        fs.Read(fileContents, 0, fileContents.Length);
                        using (Stream s = req.GetRequestStream())
                        {
                            s.Write(fileContents, 0, fileContents.Length);
                        }
                        using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
                        {
                        }
                    }
    

    【讨论】:

      【解决方案2】:

      创建一个有效期为一小时的 SAS 令牌。

      BlobSasBuilder sasBuilder = new BlobSasBuilder()
      {
          BlobContainerName = containerName,
          BlobName = blobName,
          Resource = "b",
          StartsOn = DateTimeOffset.UtcNow,
          ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
      };
      

      指定 SAS 的读取权限。

      sasBuilder.SetPermissions(BlobSasPermissions.Read);
      

      使用密钥获取 SAS 令牌。

      string sasToken = sasBuilder.ToSasQueryParameters(key, accountName).ToString();
      

      构造完整的 URI,包括 SAS 令牌。

      UriBuilder fullUri = new UriBuilder()
      {
          Scheme = "https",
          Host = string.Format("{0}.blob.core.windows.net", accountName),
          Path = string.Format("{0}/{1}", containerName, blobName),
          Query = sasToken
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-14
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-23
        • 2021-06-19
        • 1970-01-01
        相关资源
        最近更新 更多