【发布时间】:2016-08-26 08:50:16
【问题描述】:
编辑:问题是parameters.ToString()。也像刘冷宁指出你需要添加'/sprocs/sprocname'
我正在尝试使用 ASP.NET Core 1.0 / C# 中的 REST 调用在 Azure DocumentDB 中执行存储过程。
我使用这个 MSDN 页面上的方法来生成哈希: https://msdn.microsoft.com/library/azure/dn783368.aspx
我收到了 401 Unauthorized 响应。 “sprocs”是正确的文档类型,还是我必须输入不同的类型?
public class Database
{
public async Task<HttpResponseMessage> StoredProcedure(string database, string collection, string storedProcedure, string[] parameters)
{
//https://{databaseaccount}.documents.azure.com/dbs/{db-id}/colls/{coll-id}/sprocs/{sproc-name}
string resourceLink = $"dbs/{database}/colls/{collection}";
var client = Client("POST", resourceLink, "sprocs");
StringContent content = new StringContent(parameters.ToString(), null, "application/query+json");
var uri = new Uri(_endpointUri, $"dbs/{database}/colls/{collection}/sprocs/{storedProcedure}");
HttpResponseMessage response = await client.PostAsync(uri, content);
return response;
}
private HttpClient Client(string verb, string resourceLink, string resourceType)
{
var client = new HttpClient();
var utc_date = DateTime.UtcNow.ToString("r");
client.DefaultRequestHeaders.Add("x-ms-date", utc_date);
client.DefaultRequestHeaders.Add("x-ms-version", "2015-12-16");
client.DefaultRequestHeaders.Add("x-ms-max-item-count", "10000");
var authHeader = GenerateMasterKeyAuthorizationSignature(utc_date, verb, resourceLink, resourceType, _authorizationKey, "master", "1.0");
client.DefaultRequestHeaders.Add("authorization", authHeader);
return client;
}
private static string GenerateMasterKeyAuthorizationSignature(string utc_date, string verb, string resourceId, string resourceType, string key, string keyType, string tokenVersion)
{
var hmacSha256 = new System.Security.Cryptography.HMACSHA256 { Key = Convert.FromBase64String(key) };
string payLoad = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}\n{1}\n{2}\n{3}\n{4}\n",
verb.ToLowerInvariant(),
resourceType.ToLowerInvariant(),
resourceId,
utc_date.ToLowerInvariant(),
""
);
byte[] hashPayLoad = hmacSha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(payLoad));
string signature = Convert.ToBase64String(hashPayLoad);
return System.Net.WebUtility.UrlEncode(String.Format(System.Globalization.CultureInfo.InvariantCulture, "type={0}&ver={1}&sig={2}",
keyType,
tokenVersion,
signature));
}
}
【问题讨论】:
标签: c# asp.net azure authentication azure-cosmosdb