preemptively authenticationheadervalue authenticate c# rest oauth windows-runtime

c# - authenticationheadervalue - Configuración del encabezado de autorización de HttpClient



httpwebrequest authorization header c# (11)

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

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

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


Así es como lo he hecho:

using (HttpClient httpClient = new HttpClient()) { Dictionary<string, string> 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<string, string> { {"grant_type", "password"}, {"username", "[email protected]"}, {"password", "lopzwsx@23"}, }; var response = client.PostAsync("Token", new FormUrlEncodedContent(login)).Result; if (response.IsSuccessStatusCode) { tokenDetails = JsonConvert.DeserializeObject<Dictionary<string, string>>(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


Así que la forma de hacerlo es la siguiente,

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");


Busco una buena manera de lidiar con este problema y estoy considerando la misma pregunta. Con suerte, esta respuesta ayudará a todos los que tienen el mismo problema que 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


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

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

Algunas fuentes sobre cómo usar bien HttpClient:


Esto puede ayudar a establecer 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;


Estoy de acuerdo con la respuesta de TheWhiteRabbit, pero si tienes muchas llamadas con 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 auxiliar 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 }

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

Nuevamente, creo que las dos opciones anteriores hacen que el cliente que usa la declaración sea un poco menos repetitivo. Tenga en cuenta que es una buena práctica reutilizar el HttpClient si está haciendo varias llamadas http, pero creo que está un poco fuera del alcance de esta pregunta.


Para establecer la autenticación básica con C # HttpClient. El siguiente código está funcionando para mí.

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


Uso de 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);


esto podría funcionar, si está recibiendo un json o un xml del servicio y creo que esto puede darle una idea de cómo funcionan los encabezados y el tipo T también, si usa la función MakeXmlRequest (poner resultados en xmldocumnet) y MakeJsonRequest (ponga el json en la clase que desea que tenga la misma estructura que la respuesta de json) de la siguiente manera

/*-------------------------example of use-------------*/ MakeXmlRequest<XmlDocument>("your_uri",result=>your_xmlDocument_variable = result,error=>your_exception_Var = error); MakeJsonRequest<classwhateveryouwant>("your_uri",result=>your_classwhateveryouwant_variable=result,error=>your_exception_Var=error) /*-------------------------------------------------------------------------------*/ public class RestService { public void MakeXmlRequest<T>(string uri, Action<XmlDocument> successAction, Action<Exception> 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<T>(string uri, Action<T> successAction, Action<Exception> 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<T>(response); } catch (Exception ex) { errorAction(ex); return; } successAction(toReturn); } }, (error) => { if (errorAction != null) { errorAction(error); } } ); } private void MakeRequest(HttpWebRequest request, Action<string> successAction, Action<Exception> 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<T>(string responseBody) { try { var toReturns = JsonConvert.DeserializeObject<T>(responseBody); return toReturns; } catch (Exception ex) { string errores; errores = ex.Message; } var toReturn = JsonConvert.DeserializeObject<T>(responseBody); return toReturn; } } }


Utilice la autorización básica y los parámetros de 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(); }


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