Konfigūruokite „HttpClient“ autorizacijos antraštę

Turiu „HttpClient“, kurį naudoju REST API naudojimui. Tačiau turiu problemų konfigūruojant autorizacijos antraštę. Turiu konfigūruoti antraščio antraštę, kurią gavau vykdydamas savo „OAuth“ užklausą. Pamatiau .NET kodą, kuriame siūloma:

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

Tačiau „Credential“ klasė „WinRT“ nėra. Ar kas nors turi idėjų, kaip nustatyti autorizacijos antraštę?

306
Stephen Hynes 31 d 2013-01-31 16:52 '13, 16:52, 2013-01-31 16:52
@ 12 atsakymų

Taigi būdas tai padaryti yra toks:

 httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token"); 
559
31 янв. Stephen Hynes atsakymas dėl sausio 31 d 2013-01-31 17:36 '13, 17:36, 2013-01-31 17:36
 request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", Convert.ToBase64String( System.Text.ASCIIEncoding.ASCII.GetBytes( string.Format("{0}:{1}", "yourusername", "yourpwd")))); 
border=0
216
31 янв. TheWhiteRabbit atsakymas yra sausio 31 d 2013-01-31 17:37 '13, 17:37, 2013-01-31 17:37

Aš ieškau gero būdo spręsti šią problemą ir žiūriu į tą patį klausimą. Tikiuosi, kad šis atsakymas padės visiems, kurie turi tą pačią problemą kaip ir aš.

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

nuoroda iš https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi

59
21 сент. Atsakymą pateikė Willie Cheng Sep 21 2015-09-21 12:07 '15 , 12:07 2015-09-21 12:07

Sutinku su TheWhiteRabbit atsakymu, tačiau, jei turite daug skambučių naudodamiesi „HttpClient“, kodas, mano nuomone, atrodo šiek tiek pasikartojantis.

Manau, kad yra du būdai, kaip šiek tiek pagerinti atsakymą.

Sukurti pagalbinę klasę klientui sukurti:

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

Naudoti:

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

Sukurti plėtinio metodą:

Nepalaiko grožio prizo, bet jis puikiai veikia :)

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

Naudoti:

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

Dar kartą manau, kad pirmiau minėtos dvi galimybės klientui šiek tiek mažiau pasikartoja. Turėkite omenyje, kad geriausia pakartotinai naudoti „HttpClient“, jei atliekate kelis „http“ skambučius, bet manau, kad tai šiek tiek už šio klausimo ribų.

32
13 сент. Atsakymą pateikė Florian Schaal, rugsėjo 13 d 2016-09-13 12:49 '16 at 12:49 2016-09-13 12:49

Kadangi rekomenduojama pakartotinai panaudoti HttpClient egzempliorių našumo problemoms ir uosto išeikvojimui, taip pat todėl, kad nė vienas atsakymas nepateikia tokio sprendimo (ir netgi veda į blogą praktiką :(), čia pateikiu nuorodą į pateiktą atsakymą panašų klausimą:

ngn-wiki.ru.site/questions/33856 / ...

Kai kurie šaltiniai, kaip tinkamai naudoti „HttpClient“:

23
14 июля '17 в 20:20 2017-07-14 20:20 Atsakymą davė Philippe liepos 14 d. 17, 20:20 2017-07-14 20:20

Norėdami nustatyti pagrindinį autentifikavimą naudojant C # HttpClient. Šis kodas veikia man.

  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; } 
8
19 марта '18 в 6:53 2018-03-19 06:53 atsakymas pateikiamas LENG UNG 19 d. 18 val. 6:53 2018-03-19 06:53

Štai kaip aš tai padariau:

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

Šis vaizdo įrašas man padėjo man daug padėti. Prašome tai patikrinti. https://www.youtube.com/watch?v=qCwnU06NV5Q

5
23 дек. Atsakymas duotas Dayan 23 d. 2017-12-23 09:33 '17 at 9:33 2017-12-23 09:33

Naudokite pagrindines autorizacijos parinktis ir „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(); } 
5
08 апр. Atsakymas pateikiamas MohammadSoori balandžio 8 d. 2018-04-08 10:14 '18 at 10:14 2018-04-08 10:14

Naudojant „ AuthenticationHeaderValue Class System.Net.Http įrenginį

 public AuthenticationHeaderValue( string scheme, string parameter ) 

galime įdiegti arba atnaujinti esamą „ httpclient Authorization antraštę taip:

 httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", TokenResponse.AccessToken); 
3
11 июля '17 в 15:06 2017-07-11 15:06 atsakymą pateikė „ Fusion “ liepos 17 d. 17 val. 15:06 2017-07-11 15:06

Po 6 metų, tačiau pridėkite tai tuo atveju, jei jis padeda kitam.

https://www.codeproject.com/Tips/996401/Authenticate-WebAPIs-with-Basic-and-Windows-Authen

 var authenticationBytes = Encoding.ASCII.GetBytes("<username>:<password>"); using (HttpClient confClient = new HttpClient()) { confClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(authenticationBytes)); confClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(Constants.MediaType)); HttpResponseMessage message = confClient.GetAsync("<service URI>").Result; if (message.IsSuccessStatusCode) { var inter = message.Content.ReadAsStringAsync(); List<string> result = JsonConvert.DeserializeObject<List<string>>(inter.Result); } } 
0
22 янв. atsakymas duotas MPJ567 22 sausis. 2019-01-22 21:10 '19 , 9:10 pm 2019-01-22 21:10

tai gali būti naudinga, jei gausite „Json“ arba „xml“ iš paslaugos, ir manau, kad jis gali suteikti jums idėją, kaip antraštės ir T tipo darbai, jei naudojate „MakeXmlRequest“ funkciją (įterpkite rezultatus į xmldocumnet) ir „MakeJsonRequest“ (įdėti „Json“ į klasę, kurią norite, su tokia pačia struktūra kaip ir „Json“ atsakymas)

  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 = "";  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; } } } 
-2
01 авг. atsakymą pateikė Jėzus Cañedo rugpjūčio 1 d. 2014-08-01 19:35 '14, 19:35, 2014-08-01 19:35

Tai gali padėti pritaikyti pavadinimą:

 WebClient client = new WebClient(); string authInfo = this.credentials.UserName + ":" + this.credentials.Password; authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); client.Headers["Authorization"] = "Basic " + authInfo; 
-3
13 мая '14 в 12:01 2014-05-13 12:01 atsakymą pateikė Codehelp gegužės 13 d., 14 val., 12:01, 2014-05-13 12:01

Kiti klausimai apie „ arba „ Klauskite“