【问题标题】:Azure blob authorization headerAzure Blob 授权标头
【发布时间】:2016-02-24 02:17:48
【问题描述】:

我正在尝试使用 refit 从 Xamarin iOS 应用程序上传到 azure blob 存储。这是我用于改装的接口配置:

[Headers("x-ms-blob-type: BlockBlob")]
[Put("/{fileName}")]
Task<bool> UploadAsync([Body]byte[] content, string sasTokenKey,
[Header("Content-Type")] string contentType);

sasTokenKey 参数如下所示:

"/content-default/1635839001660743375-66f93195-e923-4c8b-a3f1-5f3f9ba9dd32.jpeg?sv=2015-04-05&sr=b&sig=Up26vDxQikFqo%2FDQjRB08YtmK418rZfKx1IHbYKAjIE%3D&se=2015-11-23T18:59:26Z&sp=w"

这就是我使用 Refit 调用 azure blob 服务器的方式:

var myRefitApi = RestService.For<IMyRefitAPI>("https://myaccount.blob.core.windows.net");
myRefitApi.UploadAsync(photoBytes, sasTokenKey, "image/jpeg"

但是我收到以下错误:

Response status code does not indicate success: 403 (Server failed to 
authenticate the request. Make sure the value of Authorization header is 
formed correctly including the signature.)

如果我这样直接调用 SAS url,它就可以正常工作

var content = new StreamContent(stream);
            content.Headers.Add("Content-Type", "jpeg");
            content.Headers.Add("x-ms-blob-type", "BlockBlob");
var task = HttpClient.PutAsync(new Uri(sasTokenUrl), content);
task.Wait();

所以基本上我只是想用 Refit 做同样的事情。 知道如何让 Refit 与 Azure Blob 存储一起使用吗?

谢谢!

[更新] 我现在可以将字节上传到 azure blob 服务器,但字节数据似乎有问题,因为我无法查看图像。这是我用来转换为字节数组的代码。

byte[] bytes;
using (var ms = new MemoryStream())
{
   stream.Position = 0;
   stream.CopyTo(ms);
   ms.Position = 0;
   bytes = ms.ToArray();
}

[更新] 通过使用流而不是字节数组来修复它!

【问题讨论】:

  • 我看不出您是如何在改装代码中使用 SAS 令牌的。您能否包括该部分或添加一些 cmets 以澄清?
  • 嗨@Emily,请参阅上面的澄清问题!
  • 我对改装一无所知,但是您是否尝试过发送未编码的sas令牌?我看到 %2F 和 %3D 并且我很好奇 refit 是否正在对它们进行第二次编码。
  • 我现在可以 blob 字节 :) 但我无法查看图像,所以我正在 blob 的字节似乎有问题。我添加了显示我正在从流转换为字节数组的代码。查看更新后的问题。
  • 发表了我的评论作为答案,因为看起来我猜对了。 :)

标签: ios rest azure azure-blob-storage refit


【解决方案1】:

我看到 %2F 和 %3D 并且我很好奇 refit 是否正在对它们进行第二次编码。尝试发送令牌而不对其进行编码。

【讨论】:

    【解决方案2】:

    这是对Authorization 标头的错误使用。当您想使用帐户密钥授权请求时,您可以使用 Authorization 标头。如果您有Shared Access Signature,那么您真的不需要此标头,因为授权信息包含在 SAS 本身中。您可以简单地使用 SAS URL 上传文件。

    【讨论】:

    • 嗨 Gaurav,我更新了我的问题并更改了接口配置以使用 SAS url。但是,我仍然收到有关授权的错误。我更喜欢使用 Refit,因为我将它用于所有其他 REST 端点。我想我只是设置了错误的配置。
    • 不幸的是,我不知道您正在使用 Refit。你介意分享一个链接,这样我就可以阅读更多关于它的信息。但是查看错误,我认为您的 SAS 令牌本身有问题。请检查以下内容:1) SAS 尚未过期 2) SAS 具有write 权限。另请分享获取 SAS 令牌本身的代码。
    • 我做了一些更新。请参阅顶部改装文档的链接。如果我直接调用 SAS 令牌,它就可以正常工作......请参阅底部的代码更新。
    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多