gpt4 book ai didi

.net - 使用 Rest API 访问 Azure Blob 存储

转载 作者:行者123 更新时间:2023-12-03 05:54:55 26 4
gpt4 key购买 nike

我正在尝试使用azure存储中的rest api创建容器。我已遵循微软提供的文档 here 中编写的所有内容并尝试从 here 创建授权 token 。我仍然得到:

403 Forbidden Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

下面是我的代码片段。

 class Program
{
private const string BlobStorageAccount = "myacc";
private const string BlobStorageAccessKey = "ACCESS_KEY";
static void Main(string[] args)
{
CreateContainer("myfirstcontainer");
}

private static bool CreateContainer(string containerName)
{
String requestMethod = "PUT";
String msVersion = "2016-05-31";
string dt = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);

String canHeaders = String.Format("x-ms-date:{0}\nx-ms-version:{1}", dt, msVersion);
String canResource = String.Format("/{0}/{1}\nrestype:container", BlobStorageAccount, containerName);
String SignStr = String.Format("{0}\n\n\n\n\n\n\n\n\n\n\n\n{1}\n{2}", requestMethod, canHeaders, canResource);
string auth = CreateAuthString(SignStr);
string urlPath = string.Format("https://{0}.blob.core.windows.net/{1}?restype=container", BlobStorageAccount, containerName);
Uri uri = new Uri(urlPath);

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("x-ms-date", dt);
client.DefaultRequestHeaders.Add("x-ms-version", "2016-05-31");
client.DefaultRequestHeaders.Add("x-ms-client-request-id", Guid.NewGuid().ToString());
client.DefaultRequestHeaders.Add("Authorization", auth);

HttpContent empty = null;
HttpResponseMessage response = client.PutAsync(uri, empty).Result;

return response.IsSuccessStatusCode;
}

private static String CreateAuthString(String SignStr)
{
String signature = string.Empty;
byte[] unicodeKey = Convert.FromBase64String(BlobStorageAccessKey);
using (HMACSHA256 hmacSha256 = new HMACSHA256(unicodeKey))
{
Byte[] dataToHmac = System.Text.Encoding.UTF8.GetBytes(SignStr);
signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
}

String authorizationHeader = String.Format(
CultureInfo.InvariantCulture,
"{0} {1}:{2}",
"SharedKey",
BlobStorageAccount,
signature);

return authorizationHeader;
}
}

最佳答案

您的请求包含 3 个请求 header ,但 canHeaders 仅包含 2 个。因此您需要在其中添加第三个 header 。

var clientRequestId = Guid.NewGuid().ToString();
String canHeaders = String.Format("x-ms-client-request-id:{0}\nx-ms-date:{1}\nx-ms-version:{2}", clientRequestId, dt, msVersion);
String canResource = String.Format("/{0}/{1}\nrestype:container", BlobStorageAccount, containerName);
String SignStr = String.Format("{0}\n\n\n\n\n\n\n\n\n\n\n\n{1}\n{2}", requestMethod, canHeaders, canResource);
string auth = CreateAuthString(SignStr);
string urlPath = string.Format("https://{0}.blob.core.windows.net/{1}?restype=container", BlobStorageAccount, containerName);
Uri uri = new Uri(urlPath);

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("x-ms-date", dt);
client.DefaultRequestHeaders.Add("x-ms-version", "2016-05-31");
client.DefaultRequestHeaders.Add("x-ms-client-request-id", clientRequestId);
client.DefaultRequestHeaders.Add("Authorization", auth);

关于.net - 使用 Rest API 访问 Azure Blob 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42808234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com