#c# #.net-core #hmac #azure-app-configuration
Вопрос:
Я следую этому руководству по выполнению вызова REST в конфигурацию приложения Azure, чтобы добавить запись «ключ-значение» с использованием аутентификации HMAC. Обе версии JS и c# не работают — я получаю несанкционированную ошибку 401, в которой говорится
Ошибка HMAC-SHA256=»недопустимый токен», error_description=»Недопустимая подпись»
Мой вызывающий код для реализации C# таков:
var credential = "<my app config id>";
var secret = Encoding.ASCII.GetBytes(Base64Encode("<my app config secret>"));
UserQuery.MsgRouterConfigValue body = new MsgRouterConfigValue();
var key = "asd1";
body.clientId = Guid.NewGuid();
body.serviceUrl = new Uri("https://someuri");
using (var client = new HttpClient())
{
var request = new HttpRequestMessage()
{
RequestUri = new Uri($"<my app config url>/kv/{key}?label=devamp;api-version=1.0"),
Method = HttpMethod.Put,
Content = new StringContent(JsonSerializer.Serialize(body))
};
Sign(request,credential, secret);
var resp = await client.SendAsync(request);
}
public static string Base64Encode(string plainText)
{
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
return System.Convert.ToBase64String(plainTextBytes);
}
Что касается значений, которые я использую для учетных данных и секрета, они взяты из конфигурации портала для приложений:
Кто-нибудь может посоветовать, почему я получаю ошибку 401 ?
ИЗМЕНИТЬ: Таким образом, эта ошибка сводится к:
Причина: Предоставленная подпись не соответствует ожиданиям сервера.
Решение: Убедитесь, что строка для подписи верна. Убедитесь, что Секрет правильный и правильно используется (base64 расшифрован перед использованием).
Таким образом, с точки зрения «Убедитесь, что строка для подписи верна», я использую тот же код, что и в примере, что оставляет неправильным секрет, но это то же значение, которое определено на портале для конфигурации приложения.
Ответ №1:
@auburg secret
перед использованием необходимо декодировать base64. Код, которым вы поделились, этого не делает. Возможно, вы захотите позвонить Convert.FromBase64String
.
Комментарии:
1. Фантастика — это работает для реализации C#, но это, по-видимому, противоречит комментарию о реализации JS
secret) // access key value (base64 encoded)
? Вот что меня смутило — закодирована секретная база 64 или нет ? Можете ли вы указать, как выглядит эквивалентный вызов JS ?2. @auburg, секрет, который вы получили от портала Azure, закодирован в кодировке base64 en . В документе предлагается, чтобы секрет перед использованием был закодирован на основе base64. Пример кода C# может быть обновлен, чтобы включить вызов Convert.FromBase64String, чтобы он более соответствовал другим образцам (включая JS), которые уже декодируют base64.
Ответ №2:
Я получил то же самое сообщение от Azure, хотя мои учетные данные были действительными. Оказывается, мои локальные настройки даты/времени были неверными (были внесены некоторые изменения в часы, которые испортили текущее время). Как только дата/время были установлены на фактическое текущее время, все вернулось в нормальное состояние.
Это происходит потому, что Azure выдает недолговечный токен и сравнивает ваше время UTC с их временем, чтобы убедиться, что токен действителен. Возможно, это не относится ко всем проблемам с «Недействительными токенами«, но определенно стоит проверить.
Ответ №3:
Может быть требованием TLS
пробовать:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
перед созданием клиента.
Комментарии:
1. Так что, скорее всего, это содержание вашего запроса. Можете ли вы проверить, что ваш контент является допустимым хэшем SHA256?
2. Смотрите мою правку выше, если это отвечает на ваш вопрос ?
3. я сравнил полученный хэш SHA256, введя ключ и содержимое здесь codebeautify.org/hmac-generator и они совпадают