Azure blob授权标头

时间:2015-11-21 17:13:25

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

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

[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网址工作正常

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();
}

[更新]通过使用流而不是字节数组来解决问题!

2 个答案:

答案 0 :(得分:0)

这是Authorization标头的错误使用。如果要使用帐户密钥授权请求,请使用Authorization标头。如果你有Shared Access Signature,那么你真的不需要这个标题,因为授权信息包含在SAS本身中。您只需使用SAS URL上传文件即可。

答案 1 :(得分:0)

我看到%2F和%3D,我很好奇如果改装是第二次编码。尝试发送令牌而不对其进行编码。