Si hallas algún error en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes aplicar el código al proyecto final.
Solución:
Puedes configurar HttpClient
para pasar automáticamente credenciales como esta:
var myClient = new HttpClient(new HttpClientHandler() UseDefaultCredentials = true );
Yo también estaba teniendo este mismo problema. Desarrollé una solución síncrona gracias a la investigación realizada por @tpeczek en el siguiente artículo de SO: No se puede autenticar en el servicio ASP.NET Web Api con HttpClient
Mi solución usa un WebClient
, que, como notó correctamente, pasa las credenciales sin problemas. La razón HttpClient
no funciona debido a que la seguridad de Windows deshabilita la capacidad de crear nuevos subprocesos en una cuenta suplantada (consulte el artículo SO anterior). HttpClient
crea nuevos subprocesos a través de Task Factory, lo que provoca el error. WebClient
por otro lado, se ejecuta sincrónicamente en el mismo subproceso, por lo que pasa por alto la regla y reenvía sus credenciales.
Aunque el código funciona, la desventaja es que no funcionará de forma asíncrona.
var wi = (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity;
var wic = wi.Impersonate();
try
var data = JsonConvert.SerializeObject(new
Property1 = 1,
Property2 = "blah"
);
using (var client = new WebClient UseDefaultCredentials = true )
client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
client.UploadData("http://url/api/controller", "POST", Encoding.UTF8.GetBytes(data));
catch (Exception exc)
// handle exception
finally
wic.Undo();
Nota: Requiere el paquete NuGet: Newtonsoft.Json, que es el mismo serializador JSON que usa WebAPI.
Lo que está tratando de hacer es hacer que NTLM reenvíe la identidad al siguiente servidor, lo que no puede hacer; solo puede hacer la suplantación, lo que solo le da acceso a los recursos locales. No le permitirá cruzar el límite de una máquina. La autenticación Kerberos admite la delegación (lo que necesita) mediante el uso de tickets, y el ticket se puede reenviar cuando todos los servidores y aplicaciones de la cadena están configurados correctamente y Kerberos está configurado correctamente en el dominio. Entonces, en resumen, debe cambiar de usar NTLM a Kerberos.
Para obtener más información sobre las opciones de autenticación de Windows disponibles y cómo funcionan, visite: http://msdn.microsoft.com/en-us/library/ff647076.aspx
Aquí puedes ver las reseñas y valoraciones de los lectores
Eres capaz de añadir valor a nuestro contenido dando tu experiencia en las crónicas.