Configuración del encabezado de autorización de HttpClient

Tengo un HttpClient que estoy usando para usar una API REST. Sin embargo, tengo problemas para configurar el encabezado Authorization. Necesito configurar el encabezado del token que recibí al hacer mi solicitud de OAuth. Vi un código para .NET que sugiere lo siguiente,

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

Sin embargo, la clase Credencial no existe en WinRT. ¿Alguien tiene alguna idea de cómo configurar el encabezado de Autorización?

Entonces la forma de hacerlo es la siguiente,

 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")))); 

Busco una buena manera de lidiar con este problema y estoy viendo la misma pregunta, espero que esta respuesta pueda ayudar a todos los que tienen algún problema como yo.

 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. .... } 

referencia de https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi

Estoy de acuerdo con la respuesta de The WhiteHabbit, pero si tienes muchas llamadas usando HttpClient, el código parece un poco repetitivo en mi opinión.

Creo que hay 2 formas de mejorar la respuesta un poco.

Crea una clase de ayuda para crear el cliente:

 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; } } 

Uso:

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

Crea un método de extensión:

No gana un premio de belleza, pero funciona muy bien 🙂

  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}"))); } } 

Uso:

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

De nuevo, creo que las 2 opciones anteriores hacen que el uso de la statement sea un poco menos repetitivo. Tenga en cuenta que es una buena práctica reutilizar el HttpClient si está realizando múltiples llamadas a http, pero creo que eso está un poco fuera del scope de esta pregunta.

Como es una buena práctica reutilizar la instancia de HttpClient , por problemas de rendimiento y agotamiento de puertos , y debido a que ninguna de las respuestas brinda esta solución (e incluso te lleva a malas prácticas :(), puse aquí un enlace para la respuesta que hice en una pregunta similar:

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

Algunas fonts sobre cómo usar HttpClient:

Así es como lo hice:

 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", "sa@role.com"}, {"password", "lopzwsx@23"}, }; 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()); } } } 

Este video de you-tube me ayudó mucho. Por favor, míralo. https://www.youtube.com/watch?v=qCwnU06NV5Q

Para establecer la autenticación básica con C # HttpClient. El siguiente código me funciona.

  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; } 

Utilizando la clase AuthenticationHeaderValue del ensamblado System.Net.Http

 public AuthenticationHeaderValue( string scheme, string parameter ) 

podemos configurar o actualizar el encabezado de Authorization existente para nuestro httpclient manera:

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

Use la autorización básica y los parámetros Json.

 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(); } 

Esto puede ayudar a configurar el encabezado:

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

esto podría funcionar si recibes un json o un xml del servicio y creo que esto puede darte una idea de cómo funcionan los encabezados y el tipo T, si usas la función MakeXmlRequest (pon los resultados en xmldocumnet) y MakeJsonRequest (Pon el json en la clase que desees que tenga la misma estructura que la respuesta json) de la siguiente manera

 /*-------------------------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; } } }