Comment s'authentifier avec Rest-client basé sur HttpClient et.net4

a travaillé un peu avec HttpClient pour construire un client rest. Mais je n'arrive pas à trouver, ni trouver d'exemples sur la façon de s'authentifier vers le serveur. Très probablement, je vais utiliser l'aut de base, mais vraiment tout exemple serait apprécié.

dans les versions précédentes (qui a des exemples en ligne) vous avez fait:

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

cependant la propriété TransportSettings n'existe plus dans la version 0.3.0.

33
demandé sur Tomas 2011-09-12 15:33:11

6 réponses

tous ceux-ci sont périmés. La dernière façon de le faire est la suivante:

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

using (var http = new HttpClient(handler))
{
    // ...
}
75
répondu Duncan Smart 2013-02-22 23:31:13

la bibliothèque HttpClient n'est pas devenue .Net 4. Cependant, il est disponible ici http://nuget.org/List/Packages/HttpClient . Cependant, l'authentification se fait différemment dans cette version de HttpClient.

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

ou

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

et soyez prévenus, cette bibliothèque va être mise à jour la semaine prochaine et il ya des changements mineurs de rupture!

17
répondu Darrel Miller 2011-09-12 12:49:48

j'ai essayé la suggestion de Duncan, mais ça n'a pas marché dans mon cas. Je soupçonne que c'était parce que le serveur avec lequel je m'intégrais n'a pas envoyé de défi ou demandé une authentification. Il a juste refusé mes demandes, parce que je n'ai pas fourni un en-tête autorisation .

donc j'ai fait ce qui suit:

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

noter que l'exemple ici ne fonctionne qu'avec Basic authentication .

8
répondu René 2015-10-15 17:09:52

pour ce que ça vaut, rien n'a fonctionné avec HttpClientHandler, du moins pas pour essayer de faire un appel authentifié à L'API CouchDB qui nécessite des identifiants d'administrateur de serveur.

cela a fonctionné pour moi:

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

comme indiqué dans la réponse ici:

comment utiliser les justificatifs D'identité en HttpClient en c#?

1
répondu ChrisCW 2017-05-23 12:10:48

je crois que c'est un peu vieux, mais pour quiconque cherche une réponse mise à jour, j'ai utilisé ce code lorsque j'ai construit mon serveur de test:

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

Ou cela fonctionne aussi:

            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);
                }
            }
1
répondu GaryP 2016-09-08 11:02:53

je viens de télécharger 0.3.0 il a en effet été supprimé. C'est maintenant sur HttpClientChannel

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

si elle n'est pas explicitement spécifiée, elle utilise une instance par défaut de HttpClientChannel .

mise à jour: ceci est maintenant invalide pour .Net 4.5; voir la réponse correcte ci-dessous: https://stackoverflow.com/a/15034995/58391

0
répondu TheCodeKing 2017-05-23 12:02:49