usernamepasswordvalidator - Cómo autenticarse con Rest-client basado en HttpClient y.net4
wcf usuario y contraseña (6)
Acabo de descargar 0.3.0, de hecho, se ha eliminado. Ahora está en HttpClientChannel
HttpClient client = new HttpClient(...);
var channel = new HttpClientChannel();
channel.Credentials = new NetworkCredential(...);
client.Channel = channel;
Si no se especifica explícitamente, utiliza una instancia predeterminada de HttpClientChannel
.
ACTUALIZACIÓN: esto ahora no es válido para .Net 4.5; vea la respuesta correcta a continuación: https://stackoverflow.com/a/15034995/58391
He estado elaborando un poco con HttpClient para construir un cliente de descanso. Pero no puedo descubrir ni encontrar ejemplos sobre cómo autenticarse para el servidor. Lo más probable es que use aut básico, pero realmente se apreciará cualquier ejemplo.
En versiones anteriores (que tiene ejemplos en línea) lo hizo:
HttpClient client = new HttpClient("http://localhost:8080/ProductService/");
client.TransportSettings.Credentials =
new System.Net.NetworkCredential("admin", "admin");
Sin embargo, la propiedad TransportSettings
ya no existe en la versión 0.3.0.
Creo que esto es un poco viejo, pero para cualquiera que busque una respuesta actualizada, utilicé este código cuando construí mi servidor de prueba:
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 esto también funciona:
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); } }
Intenté la sugerencia de Duncan, pero no funcionó en mi caso. Sospecho que fue porque el servidor con el que me estaba integrando no envió un desafío ni solicitó autenticación. Simplemente rechazó mis solicitudes porque no proporcioné un encabezado de Autorización .
Entonces, en cambio, hice lo siguiente:
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.
}
Tenga en cuenta que el ejemplo aquí solo funciona con autenticación básica .
La biblioteca HttpClient no llegó a .Net 4. Sin embargo, está disponible aquí http://nuget.org/List/Packages/HttpClient . Sin embargo, la autenticación se realiza de forma diferente en esta versión de 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);
¡Y tenga cuidado, esta biblioteca se actualizará la próxima semana y hay pequeños cambios!
Por lo que vale, nada que use HttpClientHandler funcionó, al menos no para tratar de realizar una llamada autenticada a la API de CouchDB que requiere credenciales de administrador del servidor.
Esto funcionó para mí:
using( var client = new HttpClient() )
{
var byteArray = Encoding.ASCII.GetBytes("MyUSER:MyPASS");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
....
}
Como se describe en la respuesta aquí:
Todos estos están desactualizados. La forma final de hacerlo es la siguiente:
var credentials = new NetworkCredential(userName, password);
var handler = new HttpClientHandler { Credentials = credentials };
using (var http = new HttpClient(handler))
{
// ...
}