Haz una prueba.... Crea un servicio web sencillo (sumar dos números por ejemplo), y en IIS desactiva la casilla de autenticación anónima, dejando marcada alguna de las que exigen autenticación Windows. A continuación llama al servicio web desde un cliente cualquiera...  ¡Moooc!

Falla, como es lógico, porque al contrario que al usarlo desde un navegador, no aparece un diálogo de autenticación que te solicite las credenciales. Entonces, ¿cómo hacemos?

Lo normal es que queramos pasarle autom├íticamente las credenciales del usuario actual, para as├ş validarlo y hacer la autorizaci├│n en los m├ętodos del servicio web en funci├│n de los roles a los que pertenezca. En realidad es muy sencillo conseguirlo, s├│lo hay que usar el siguiente c├│digo:

servicioWeb.Credentials= System.Net.CredentialCache.DefaultCredentials;

Esto hace que se le pasen las credenciales por defecto usando para ello un objeto de la clase NetworkCredential.

Por cierto mucho cuidado al usar esto desde ciertos tipos de cliente del servicio web. Por ejemplo en el caso de una aplicación ASP.NET las credenciales que se le pasarán dependerán de la combinación de sistema operativo, ajustes de web.config, tipo de autenticación de IIS, etc... que se hayan elegido, ya que en cada caso se suplanta a un usuario diferente como bien saben los que han asistido al curso gratuito de "Seguridad avanzada en  IIS" en campusMVP.

En esos casos hay que pasarle las credenciales de un usuario concreto.

Pero... ┬┐y si necesito pasarle un nombre de usuario y contrase├▒a concretos?

Entonces hay que dar alguna vuelta m├ís, pero tampoco es algo complicado en exceso. Lo que hay que hacer es crear un objeto de la clase NetworkCredential con las credenciales que nos interesan y para la URL del servicio Web, y a├▒adirlo a la cah├ę de credenciales antes de pasarlo al proxy de nuestro servicio web. Ser├şa algo as├ş:

//Se crea una instancia de la cach├ę de credenciales
CredentialCache cache = new CredentialCache();

//Se crea una nueva credencial con los datos apropiados
NetworkCredential credencial = new NetworkCredential("Usuario", "Clave", "Dominio");

//Y se a├▒ade a la cach├ę asoci├índola con la URl del servicio web
cache.Add( new Uri(servicioWeb.Url), "Negotiate", credencial);

//y ahora se asocia la cach├ę a las credenciales del servicio web: voil├ó!
servicioWeb.Credentials = cache;

Creo que es un tema muy interesante para conseguir una securización básica de los servicios web sin recurrir a extensiones como WSE 2.0.

💪🏻 ┬┐Este post te ha ayudado?, ┬┐has aprendido algo nuevo?
Pues NO te pido que me invites a un caf├ę... Te pido algo m├ís f├ícil y mucho mejor

Escrito por un humano, no por una IA