2011-09-12 11 views
30

State elaborando un po 'con HttpClient per creare un client di riposo. Ma non riesco a capire, né trovare esempi su come autenticarsi verso il server. Molto probabilmente userò l'aut di base, ma davvero qualsiasi esempio sarebbe apprezzato.Come autenticarsi con Rest-client basato su HttpClient e .net4

Nelle versioni precedenti (che ha esempi in linea) che hai fatto:

HttpClient client = new HttpClient("http://localhost:8080/ProductService/"); 
client.TransportSettings.Credentials = 
    new System.Net.NetworkCredential("admin", "admin"); 

Tuttavia la proprietà TransportSettings non esiste più nella versione 0.3.0.

risposta

66

Tutti questi non sono aggiornati. L'ultimo modo per farlo è la seguente:

var credentials = new NetworkCredential(userName, password); 
var handler = new HttpClientHandler { Credentials = credentials }; 

using (var http = new HttpClient(handler)) 
{ 
    // ... 
} 
+2

Questa è l'unica risposta che funziona per .NET 4.5 – Frank

+5

Sto usando VS2013 e .NET 4.5 L'intestazione dell'autorizzazione non viene impostata. Posso solo impostare l'intestazione direttamente attraverso la proprietà. Cos'altro potrei mancare? – Alex

+4

@Alex provare l'impostazione 'HttpClientHandler.PreAuthenticate = true' http://msdn.microsoft.com/en-us/library/system.net.http.httpclienthandler.preauthenticate.aspx –

0

Ho appena scaricato 0.3.0 è stato effettivamente rimosso. E 'ora in HttpClientChannel

HttpClient client = new HttpClient(...); 
var channel = new HttpClientChannel(); 
channel.Credentials = new NetworkCredential(...); 
client.Channel = channel; 

Se non specificato in modo esplicito che utilizza un'istanza predefinita di HttpClientChannel.

UPDATE: questo non è più valido per .Net 4.5; vedere la risposta corretta di seguito: https://stackoverflow.com/a/15034995/58391

+0

Che è una versione precedente? Sto usando 0.3.0 da nuget. – Tomas

+0

@Thomas Quello in RSK era un prototipo. La versione di nuget è stata riscritta da un'altra squadra, in base a ciò che hanno appreso dal prototipo. –

+0

Ottenuto questo lavoro dopo l'aggiunta dell'autenticazione preventiva. Grazie – Tomas

17

La libreria HttpClient non è stata inserita in .Net 4. Tuttavia è disponibile qui http://nuget.org/List/Packages/HttpClient. Tuttavia, l'autenticazione viene eseguita in modo diverso in questa versione di HttpClient.

var httpClient = new HttpClient(); 
httpClient.DefaultRequestHeaders.Authorization 
        = new AuthenticationHeaderValue("basic","..."); 

o

var webRequestHandler = new WebRequestHandler(); 
CredentialCache creds = new CredentialCache(); 
creds.Add(new Uri(serverAddress), "basic", 
         new NetworkCredential("user", "password")); 
webRequestHandler.Credentials = creds; 
var httpClient = new HttpClient(webRequestHandler); 

e deve essere avvertito, questa libreria sta per ottenere aggiornato la prossima settimana e ci sono cambiamenti di rottura minori!

+0

Yupp, mi dispiace per essere stato confuso. questa è la versione che ho ottenuto, quella di Nuget. – Tomas

+1

Ho giocato con questo, ma non riuscivo a farlo funzionare. Ma come ho capito, il "..." dovrebbe essere uname: codificato in pwd base64? – Tomas

+0

@Thomas esattamente. –

8

Ho provato il suggerimento di Duncan, ma non ha funzionato nel mio caso. Ho il sospetto che fosse perché il server con cui mi stavo integrando, non ha inviato una richiesta o chiesto l'autenticazione. Ha appena rifiutato le mie richieste, perché non ho fornito un'intestazione Autorizzazione.

Così ho invece fatto il seguente:

using (var client = new HttpClient()) 
{ 
    var encoding = new ASCIIEncoding(); 
    var authHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(encoding.GetBytes(string.Format("{0}:{1}", "username", "password")))); 
    client.DefaultRequestHeaders.Authorization = authHeader; 
    // Now, the Authorization header will be sent along with every request, containing the username and password. 
} 

Si noti che l'esempio lavora qui solo con Basic authentication.

1

Per quello che vale, niente utilizzando HttpClientHandler ha funzionato, almeno non per provare a effettuare una chiamata autenticata all'API CouchDB che richiede credenziali di amministratore del server.

questo ha funzionato per me:

using(var client = new HttpClient()) 
{ 
    var byteArray = Encoding.ASCII.GetBytes("MyUSER:MyPASS"); 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
    .... 
} 

Come indicato nella risposta qui:

How to use credentials in HttpClient in c#?

+0

è lo stesso di @ Renè risposta [qui sopra] (http://stackoverflow.com/a/22096194/540776)? – superjos

1

Credo che questo sia un po 'vecchio, ma per tutti coloro che cercano una risposta aggiornata, io usato questo codice quando ho costruito il mio server di prova:

 using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://myServer/api/Person"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      var byteArray = Encoding.ASCII.GetBytes($"{UserName}:{ApiPassword}"); 
      client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 

O questo funziona anche:

  using (var http = new HttpClient()) 
      { 
       // byteArray is username:password for the server 
       var byteArray = Encoding.ASCII.GetBytes("myUserName:myPassword"); 
       http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
       string uri = "http://myServer/api/people" ; 
       var response = await http.GetStringAsync(uri); 
       List<Person> agencies = JsonConvert.DeserializeObject<List<Person>>(response); 
       foreach (Person person in people) 
       { 
        listBox1.Items.Add(person.Name); 
       } 
      } 
Problemi correlati