Проверка подлинности Azure App Config HMAC возвращает несанкционированную ошибку

#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 и они совпадают