EDIT: Проблема была в параметрах. ToString(). Также, как и Lengning Liu, вам нужно добавить '/ sprocs/sprocname'как аутентифицировать хранимую процедуру documentdb REST-вызов
Я пытаюсь выполнить хранимую процедуру в Azure DocumentDB с вызовом REST в ASP.NET Core 1.0/C#.
Я использую метод на этой странице MSDN для создания хэш: https://msdn.microsoft.com/library/azure/dn783368.aspx
Я получаю 401 Несанкционированное repsonse. Является ли «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));
}
}
Если я добавлю/sprocs/{storedProcedure} в хэш, я получаю неверный запрос. Кроме того, я не вижу никакой реальной разницы в том, как ключ хэшируется. – Ben
Dived глубже в него: проблема была в этом: parameters.ToString() – Ben