Как пройти аутентификацию с Rest-клиентом на основе HttpClient и .net4 - PullRequest
36 голосов
/ 12 сентября 2011

Мы немного проработали с HttpClient для создания клиента отдыха. Но я не могу ни выяснить, ни найти примеры того, как проходить аутентификацию на сервере. Скорее всего, я буду использовать базовый aut, но на самом деле любой пример будет оценен.

В более ранних версиях (с примерами в Интернете) вы делали:

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

Однако свойство TransportSettings больше не существует в версии 0.3.0.

Ответы [ 6 ]

88 голосов
/ 23 февраля 2013

Все это устарело. Последний способ сделать это следующим образом:

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

using (var http = new HttpClient(handler))
{
    // ...
}
17 голосов
/ 12 сентября 2011

Библиотека HttpClient не вошла в .Net 4. Однако она доступна здесь http://nuget.org/List/Packages/HttpClient. Однако аутентификация в этой версии HttpClient выполняется иначе.

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

или

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

И имейте в виду, эта библиотека будет обновлена ​​на следующей неделе, и в ней будут небольшие изменения!

9 голосов
/ 28 февраля 2014

Я попробовал предложение Дункана, но в моем случае это не сработало.Я подозреваю, что это потому, что сервер, с которым я интегрировался, не отправил запрос или не запросил аутентификацию.Он просто отклонил мои запросы, потому что я не предоставил заголовок Authorization .

Так что вместо этого я сделал следующее:

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

Обратите внимание, что пример здесь толькоработает с Обычная аутентификация .

1 голос
/ 11 июля 2014

Что бы это ни стоило, ничего с помощью HttpClientHandler не сработало, по крайней мере, не для попытки сделать аутентифицированный вызов API CouchDB, который требует учетных данных администратора сервера.

Это сработало для меня:

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

Как указано в ответе здесь:

Как использовать учетные данные в HttpClient в c #?

0 голосов
/ 08 сентября 2016

Я считаю, что это немного устарело, но для тех, кто ищет обновленный ответ, я использовал этот код при сборке моего тестового сервера:

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

Или это тоже работает:

            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);
                }
            }
0 голосов
/ 12 сентября 2011

Я только что скачал 0.3.0, он действительно был удален.Теперь он включен на HttpClientChannel

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

Если явно не указано, используется экземпляр по умолчанию HttpClientChannel.

ОБНОВЛЕНИЕ: thisтеперь недействителен для .Net 4.5;см. правильный ответ ниже: https://stackoverflow.com/a/15034995/58391

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...