#c# #.net #http-headers #authorization #dotnet-httpclient
#c# #.net #http-заголовки #авторизация #dotnet-httpclient
Вопрос:
Я устанавливаю заголовок авторизации HttpClient
следующим образом:
httpClient
.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(null, "abc");
…но я получаю исключение:
«схема» значения AuthenticationHeaderValue не может быть нулевой.
Почему должна AuthenticationHeaderValue
быть схема? Требуется ли это конкретным RFC?
Комментарии:
1. Разочаровывает то, что принятый ответ на самом деле не отвечает на ваш вопрос, почему вы должны использовать схему или как вы можете сделать это без схемы, потому что схема не всегда требуется (например, проверка заголовка пользовательской авторизации).
Ответ №1:
Схема используется для определения того, какой тип аутентификации вы используете:
- Базовые модели
- Oauth
- Носитель
- Дайджест
- и т.д.
Заголовок будет выглядеть так:
{
"key": "Authorization",
"value": "<scheme> <parameter>"
}
Попробуйте использовать Postman, чтобы увидеть, что генерируется на основе различных типов аутентификации, поддерживаемых HTTP.
Комментарии:
1. Есть ли где-нибудь полный список доступных схем?
2. Быстрый поиск в Google обнаружил это: learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details /…
3. Действительно удивлен, что нет перечисления, содержащего эти значения. :O
4. Может быть, потому, что это не конечный список? Просто догадываюсь 🙂
Ответ №2:
Иногда вы не можете установить заголовок авторизации со схемой. Это также относится к проекту, над которым я сейчас работаю. Мне нужно подключиться к API из TopDesk, но схема не указана.
Заголовок авторизации из TopDesk должен иметь значение like TOKEN id="0d1739df-8952-41c0-94cd-b25287446b22"
, поэтому я не могу использовать схему. Я решил проблему, добавив заголовок авторизации, как в следующем примере, и это работает как шарм.
client.DefaultRequestHeaders.Add("Authorization", $"TOKEN id="{token}"");
Я знаю, что это старый вопрос, но я подумал, что, возможно, кто-то в будущем рассмотрит этот ответ и найдет его полезным. Я столкнулся с этим вопросом таким же образом.
Комментарии:
1. В этом случае, конечно, схема является «ТОКЕНОМ»?
2. @EdB точно, в данном случае это пользовательская схема «ТОКЕН»
3. итак
Authorization = new AuthenticationHeaderValue("TOKEN", "id="{token}"")
?4. @JamesBarrass действительно, это работает в этом примере (за исключением пропуска символа $ перед строковым объявлением значения). Для конкретного варианта использования исходного вопроса это бы не сработало, потому что ожидается только значение.
Ответ №3:
Для меня токен авторизации, который мне был нужен, был только строкой в кодировке base64, без схемы.
Пример: «Авторизация: SnVzdCBhIGR1bW15IHRva2Vu». Конечная точка API, к которой я подключался, отказалась принимать схему типа «Basic» или что-то еще. Мне пришлось использовать:
HttpRequestMessage hrMessage = new HttpRequestMessage ();
hrMessage.Headers.TryAddWithoutValidation("Authorization", "SnVzdCBhIGR1bW15IHRva2Vu");
Это сработало.