Настройка заголовка авторизации HttpClient

У меня есть HttpClient, который я использую для использования REST API. Однако у меня возникли проблемы с настройкой заголовка авторизации. Мне нужно настроить заголовок на токен, который я получил от выполнения моего запроса OAuth. Я видел некоторый код для .NET, который предлагает следующее:

httpClient.DefaultRequestHeaders.Authorization = new Credential(OAuth.token); 

Однако class Credential делает это не в WinRT. У кого-нибудь есть идеи, как установить заголовок авторизации?

Таким образом, способ сделать это заключается в следующем,

 httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token"); 
 request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", Convert.ToBase64String( System.Text.ASCIIEncoding.ASCII.GetBytes( string.Format("{0}:{1}", "yourusername", "yourpwd")))); 

Я ищу хороший способ справиться с этой проблемой, и я смотрю на тот же вопрос, надеюсь, этот ответ может помочь каждому, у кого есть такая проблема, как я.

 using (var client = new HttpClient()) { var url = "https://www.theidentityhub.com/{tenant}/api/identity/v1"; client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken); var response = await client.GetStringAsync(url); // Parse JSON response. .... } 

ссылка с https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi

Я согласен с ответом TheWhiteRabbit, но если у вас много вызовов с использованием HttpClient, код кажется несколько повторяющимся, на мой взгляд.

Я думаю, что есть два способа улучшить ответ.

Создайте class-помощник для создания клиента:

 public static class ClientHelper { // Basic auth public static HttpClient GetClient(string username,string password) { var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"))); var client = new HttpClient(){ DefaultRequestHeaders = { Authorization = authValue} //Set some other client defaults like timeout / BaseAddress }; return client; } // Auth with bearer token public static HttpClient GetClient(string token) { var authValue = new AuthenticationHeaderValue("Bearer", token); var client = new HttpClient(){ DefaultRequestHeaders = { Authorization = authValue} //Set some other client defaults like timeout / BaseAddress }; return client; } } 

Применение:

 using(var client = ClientHelper.GetClient(username,password)) { //Perform some http call } using(var client = ClientHelper.GetClient(token)) { //Perform some http call } 

Создайте метод расширения:

Не выигрывает приз красоты, но отлично работает 🙂

  public static class HttpClientExtentions { public static AuthenticationHeaderValue ToAuthHeaderValue(this string username, string password) { return new AuthenticationHeaderValue("Basic", Convert.ToBase64String( System.Text.Encoding.ASCII.GetBytes( $"{username}:{password}"))); } } 

Применение:

 using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = _username.ToAuthHeaderValue(_password); } 

Опять же, я думаю, что 2 над вариантами делают клиент, использующий оператор, немного менее повторяющимся. Имейте в виду, что лучше использовать повторно HttpClient, если вы делаете несколько HTTP-звонков, но я думаю, что это немного выходит за frameworks этого вопроса.

Поскольку это хорошая практика повторного использования экземпляра HttpClient для производительности и проблем с исчерпанием порта , и потому что ни один из ответов не дает этого решения (и даже ведет вас к плохой практике :(), я помещаю здесь ссылку на ответ, который я сделал по аналогичному вопросу:

https://stackoverflow.com/a/40707446/717372

Некоторые источники о том, как хорошо использовать HttpClient:

Вот как я это сделал:

 using (HttpClient httpClient = new HttpClient()) { Dictionary tokenDetails = null; var messageDetails = new Message { Id = 4, Message1 = des }; HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:3774/"); var login = new Dictionary { {"grant_type", "password"}, {"username", "[email protected]"}, {"password", "[email protected]"}, }; var response = client.PostAsync("Token", new FormUrlEncodedContent(login)).Result; if (response.IsSuccessStatusCode) { tokenDetails = JsonConvert.DeserializeObject>(response.Content.ReadAsStringAsync().Result); if (tokenDetails != null && tokenDetails.Any()) { var tokenNo = tokenDetails.FirstOrDefault().Value; client.DefaultRequestHeaders.Add("Authorization", "Bearer " + tokenNo); client.PostAsJsonAsync("api/menu", messageDetails) .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode()); } } } 

Это видео с вашей трубкой помогает мне много. Пожалуйста, проверьте это. https://www.youtube.com/watch?v=qCwnU06NV5Q

Чтобы установить базовую аутентификацию с помощью C # HttpClient. Следующий код работает для меня.

  using (var client = new HttpClient()) { var webUrl ="http://localhost/saleapi/api/"; var uri = "api/sales"; client.BaseAddress = new Uri(webUrl); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.ConnectionClose = true; //Set Basic Auth var user = "username"; var password = "password"; var base64String =Convert.ToBase64String( Encoding.ASCII.GetBytes($"{user}:{password}")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",base64String); var result = await client.PostAsJsonAsync(uri, model); return result; } 

Использование classа AuthenticationHeaderValue для сборки System.Net.Http

 public AuthenticationHeaderValue( string scheme, string parameter ) 

мы можем установить или обновить существующий заголовок Authorization для нашего httpclient следующим образом:

 httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", TokenResponse.AccessToken); 

Используйте Basic Authorization и Json Parameters.

 using (HttpClient client = new HttpClient()) { var request_json = "your json string"; var content = new StringContent(request_json, Encoding.UTF8, "application/json"); var authenticationBytes = Encoding.ASCII.GetBytes("YourUsername:YourPassword"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authenticationBytes)); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var result = await client.PostAsync("YourURL", content); var result_string = await result.Content.ReadAsStringAsync(); } 

Это может помочь настроить заголовок:

 WebClient client = new WebClient(); string authInfo = this.credentials.UserName + ":" + this.credentials.Password; authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); client.Headers["Authorization"] = "Basic " + authInfo; 

это может работать, если вы получаете json или xml из службы, и я думаю, что это может дать вам представление о том, как работают заголовки и тип T, если вы используете функцию MakeXmlRequest (поместите результаты в xmldocumnet) и MakeJsonRequest (поместите json в class, который вы хотите, с той же структурой, что и ответ json) следующим образом

 /*-------------------------example of use-------------*/ MakeXmlRequest("your_uri",result=>your_xmlDocument_variable = result,error=>your_exception_Var = error); MakeJsonRequest("your_uri",result=>your_classwhateveryouwant_variable=result,error=>your_exception_Var=error) /*-------------------------------------------------------------------------------*/ public class RestService { public void MakeXmlRequest(string uri, Action successAction, Action errorAction) { XmlDocument XMLResponse = new XmlDocument(); string wufooAPIKey = ""; /*or username as well*/ string password = ""; StringBuilder url = new StringBuilder(); url.Append(uri); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url.ToString()); string authInfo = wufooAPIKey + ":" + password; authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); request.Timeout = 30000; request.KeepAlive = false; request.Headers["Authorization"] = "Basic " + authInfo; string documento = ""; MakeRequest(request,response=> documento = response, (error) => { if (errorAction != null) { errorAction(error); } } ); XMLResponse.LoadXml(documento); successAction(XMLResponse); } public void MakeJsonRequest(string uri, Action successAction, Action errorAction) { string wufooAPIKey = ""; string password = ""; StringBuilder url = new StringBuilder(); url.Append(uri); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url.ToString()); string authInfo = wufooAPIKey + ":" + password; authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); request.Timeout = 30000; request.KeepAlive = false; request.Headers["Authorization"] = "Basic " + authInfo; // request.Accept = "application/json"; // request.Method = "GET"; MakeRequest( request, (response) => { if (successAction != null) { T toReturn; try { toReturn = Deserialize(response); } catch (Exception ex) { errorAction(ex); return; } successAction(toReturn); } }, (error) => { if (errorAction != null) { errorAction(error); } } ); } private void MakeRequest(HttpWebRequest request, Action successAction, Action errorAction) { try{ using (var webResponse = (HttpWebResponse)request.GetResponse()) { using (var reader = new StreamReader(webResponse.GetResponseStream())) { var objText = reader.ReadToEnd(); successAction(objText); } } }catch(HttpException ex){ errorAction(ex); } } private T Deserialize(string responseBody) { try { var toReturns = JsonConvert.DeserializeObject(responseBody); return toReturns; } catch (Exception ex) { string errores; errores = ex.Message; } var toReturn = JsonConvert.DeserializeObject(responseBody); return toReturn; } } } 
  • Удаление всех неглавных символов с помощью регулярных выражений (регулярные выражения в шаблоне регулярных выражений C #)
  • Добавление жестов салфетки для открытия панели SplitView
  • WinRT и региональные настройки. Правильный способ форматирования дат и чисел на основе региональных настроек пользователя?
  • Правильный способ получения CoreDispatcher в приложении Windows Store
  • Обновить пользовательский интерфейс из streamа в WinRT
  • Как распечатать содержимое WebView в приложении Windows Store?
  • Как написать файл с помощью StreamWriter в Windows 8?
  • Как проверить, существует ли файл в приложении Windows Store?
  • Interesting Posts

    Где ошибка CS0433 «Тип« X »уже существует как в A.dll, так и в B.dll?

    Восстановленные видеофайлы не будут воспроизводиться

    Могу ли я заставить пользователя iPhone обновить приложение?

    Шрифты facebook испорчены

    Как определить прокрутку страницы до определенной точки в jQuery?

    Использование файлов треков в Windows 7

    как реализовать основную функцию в polymerных приложениях

    Получить путь изображения от ACTION_IMAGE_CAPTURE Intent

    Как объединить факторы, не превращая их в целые уровни?

    Как взаимодействовать с бесшумной установкой msi? (Данные прогресса и отменить его)

    С чем следует заменить устаревший метод sizeWithFont:?

    Как заставить Firefox не кэшировать или повторно загружать файл Silverlight XAP?

    Лучший способ получить геолокацию в Java

    Выберите строки, соответствующие всем элементам списка.

    Как сделать скриншот другого приложения программно без разрешения root, например, Скриншот UX Trial?

    Давайте будем гением компьютера.