Подтвердить что ты не робот

Как выполнить аутентификацию с помощью Rest-client на основе HttpClient и .net4

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Библиотека 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);

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

Ответ 3

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

Итак, я сделал следующее:

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

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

Ответ 4

Для чего ничего не стоит использовать 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 в С#?

Ответ 5

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

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

Ответ 6

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

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

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

UPDATE:, это теперь недействительно для .Net 4.5; см. правильный ответ ниже: fooobar.com/info/179860/...