Impostazione dell’intestazione di authorization di HttpClient

Ho un HttpClient che sto usando per utilizzare un’API REST. Tuttavia ho problemi a impostare l’intestazione Autorizzazione. Devo impostare l’intestazione sul token che ho ricevuto facendo la mia richiesta OAuth. Ho visto del codice per .NET che suggerisce quanto segue,

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

Tuttavia la class Credential non esiste in WinRT. Qualcuno ha qualche idea su come impostare l’intestazione Autorizzazione?

Quindi il modo per farlo è il seguente,

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

Cerco un buon modo per affrontare questo problema e sto guardando la stessa domanda, speriamo che questa risposta possa aiutare tutti quelli che hanno qualche dubbio come me.

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

riferimento da https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi

Sono d’accordo con la risposta di TheWhiteRabbit, ma se hai un sacco di chiamate usando HttpClient il codice sembra un po ‘ripetitivo a mio parere.

Penso che ci siano 2 modi per migliorare la risposta un po ‘.

Crea una class helper per creare il client:

 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 metodo di estensione:

Non vince un premio di bellezza ma funziona benissimo 🙂

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

Ancora una volta penso che 2 opzioni precedenti rendano il client che usa l’istruzione un po ‘meno ripetitivo. Tieni presente che è consigliabile riutilizzare HttpClient se si effettuano più chiamate http, ma penso che sia un po ‘fuori portata per questa domanda.

Poiché è una buona pratica riutilizzare l’istanza HttpClient , per problemi di prestazioni e di esaurimento delle porte , e poiché nessuna delle risposte fornisce questa soluzione (e persino guida alle cattive pratiche :(), inserisco qui un link verso la risposta che ho fatto su una domanda simile:

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

Alcune fonti su come usare bene HttpClient:

Questo è come l’ho fatto:

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

Questo video di you-tube mi aiuta molto. Per favore controlla. https://www.youtube.com/watch?v=qCwnU06NV5Q

Per impostare l’autenticazione di base con C # HttpClient. Il seguente codice funziona per me.

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

Utilizzo della class AuthenticationHeaderValue dell’assembly System.Net.Http

 public AuthenticationHeaderValue( string scheme, string parameter ) 

possiamo impostare o aggiornare l’intestazione di Authorization esistente per il nostro httpclient modo:

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

Utilizzare l’authorization di base e i parametri 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(); } 

Questo può aiutare a impostare l’intestazione:

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

questo potrebbe funzionare, se stai ricevendo un json o un xml dal servizio e penso che questo possa darti un’idea di come funzionano anche le intestazioni e il tipo T, se usi la funzione MakeXmlRequest (metti i risultati in xmldocumnet) e MakeJsonRequest (metti il ​​json nella class che desideri abbia la stessa struttura della risposta JSON) nel modo seguente

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