none
Utilizar servicio web solo con autenticacion windows. RRS feed

  • Pregunta

  • Hola a todos como va, bueno necesito ayuda en algo que estoy totalmente perdido, acabo de heredar un proyecto web, el cual tiene tres servicios (Serv1.svc, Serv2.sv y Serv3.asmx), todo funciona a la perfección así que no tengo que tocar nada de los servicios (parámetros de entrada ni parámetros de salida), pero este proyecto esta observado porque no tiene seguridad (autenticación) para su consumo (cualquiera que sepa la url y los parámetros lo puede consumir), bueno pues me pidieron que le aumente seguridad. Como ya lo dije sin tocar los parámetros de entrada y salida que ya tienen definidos los servicios.

    Por ahí me comentaron que es fácil, que simplemente le ponga al servicio autenticación Windows, pero como hago esto? Como ya lo dije la idea es que se autentifique el usuario (como perteneciente al dominio) pero sin tocar los parámetros (pero si no toco los parámetros por donde enviaría usuario y contraseña?).

    También escuche algo de credenciales pero igual estoy perdido en el tema.

    la clave es tener un método de autenticación.

    Bueno como lo ven estoy perdido, de antemano agradecería mucho que alguien me oriente.


    miércoles, 14 de octubre de 2015 20:11

Respuestas

  • para pasar las credenciales Windows deberías hacer los siguiente

    ServiceReference1.Prueba_01Client ins = new ServiceReference1.Prueba_01Client();
    
    ins.ClientCredentials.Windows.ClientCredential = 
        System.Net.CredentialCache.DefaultNetworkCredentials;

    le pasas las credenciales por defecto que son las del usr identificado en el dominio

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 15 de octubre de 2015 17:26
    Moderador

Todas las respuestas

  • hola

    el proyecto web y los servicio ejecutan en una red local? o sea puedes integrarlos a windows

    o estaran expuestos a internet ?

    Chapter 4: WCF Security Fundamentals


    lo planteo porque si usas el wsHttpBinding podrias usar la seguridad de windows

    o podrias usar un certificado

    How to: Use Certificate Authentication and Message Security in WCF Calling from Windows Forms

    de esta forma solo los clientes que tengan instalado este certificado podran acceder

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 14 de octubre de 2015 21:06
  • Para establecer una autenticación Windows en tu servicio WCF basta con agregar al web.config del mismo lo siguiente.

    si por ejemplo el tipo de binding es basicHttpBinding deberás

    <basicHttpBinding>
        <binding name="BasicHttpEndpointBinding">
          <security mode="Message">
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    como ves en el transport se define que las credenciales son las de Windows


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos



    miércoles, 14 de octubre de 2015 21:09
    Moderador
  • miércoles, 14 de octubre de 2015 21:13
    Moderador
  • Hola Leandro y Sergio, les comento que todos serán clientes de la red local, bueno a lo que me dijeron entiendo que es bastante simple aumentando código en el web.config, bueno creo que eso es fácil de investigar, ahora algo que me intriga es que con esto de la autenticación Windows es:

    • Si aumento esta configuración, los clientes del servicio tendrán que modificar algo de su código (esto es lo que no se quiere)
    • El servicio como tal (parámetros de entrada y salida) serán modificados (esto no se quiere).

    Bueno como ya dije desconozco bastante esto de autentificación en servicios.


    Roy Sillerico

    miércoles, 14 de octubre de 2015 22:14
  • 1.- los clientes en principio debes realizar un update reference para refrescar la configuración pero aparte de eso creo que no modifica mas código.

    2.- el servicio como tal no varía


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 14 de octubre de 2015 22:25
    Moderador
  • lo mejor es que hagas una pequeña prueba con algún servicio que tengas expuesto. O implementarte uno desde cero que no cuesta mucho tiempo. Aplicas la configuracion de las credenciales wimdows y te creas un cliente. Después yo analizaría los mensajes con Fiddler para ver si las credenciales se envían en el Soap envelope

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 14 de octubre de 2015 22:27
    Moderador
  • Para establecer una autenticación Windows en tu servicio WCF basta con agregar al web.config del mismo lo siguiente.

    si por ejemplo el tipo de binding es basicHttpBinding deberás

    <basicHttpBinding>
        <binding name="BasicHttpEndpointBinding">
          <security mode="Message">
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    como ves en el transport se define que las credenciales son las de Windows


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos




    he actualizado mi configuración. Las credenciales debes viajar en el mensaje soap

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 14 de octubre de 2015 22:41
    Moderador
  • Holas, bueno logre publicar el servicio con autenticación Windows configurando el IIS, ahora bien, como los consumo ya que no es como un servicio publico de libre acceso, mas que todo mi inquietud es, como los consumo desde una maquina del dominio dentro la intranter, y también como lo consumo desde una maquina fuera del dominio y de la red.

    Intente con esto:

    ServiceReference1.Prueba_01Client ins = new ServiceReference1.Prueba_01Client();
                NetworkCredential cred = new NetworkCredential("ususario", "pass", "dominio");
                CredentialCache credC = new CredentialCache();
                credC.Add(new Uri(ins.Url), "Basic", cred);
                ins.ClientCredentials = credC;

    Pero hay error en línea 4 (ins.url)  toda la línea 5.


    Roy Sillerico

    jueves, 15 de octubre de 2015 16:50
  • para pasar las credenciales Windows deberías hacer los siguiente

    ServiceReference1.Prueba_01Client ins = new ServiceReference1.Prueba_01Client();
    
    ins.ClientCredentials.Windows.ClientCredential = 
        System.Net.CredentialCache.DefaultNetworkCredentials;

    le pasas las credenciales por defecto que son las del usr identificado en el dominio

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 15 de octubre de 2015 17:26
    Moderador
  • Gracias me funciona a la perfección, y para que otro usuario consuma el mismo servicio fuera del dominio? me imagino que hay que hacer algo parecido a mi anterior publicación donde se le pasa usuario, contraseña y dominio. Pero como se lo hace???

    Roy Sillerico

    jueves, 15 de octubre de 2015 18:23
  • pero cuando dices fuera del dominio te refieres fuera de tu red? O el usuario está incluido en el Active Directory de tu Domain?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 15 de octubre de 2015 19:09
    Moderador
  • deberías establecer como modo de seguridad de tipo Message para incluir en el mensaje Soap el username y el password. Pero recuerda establecer en el server un certificado para encriptar el user y password. Este enlace lo explica bien https://msdn.microsoft.com/en-us/library/ms733131(v=vs.110). aspx

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 15 de octubre de 2015 19:18
    Moderador
  • Ya logre que me funcione todo, lo raro es que si comento la segunda línea del código que me proporcionaste igual funciona:

    Algo raro es que si comento la línea de la asignación de credenciales igual funciona:
                ServiceReference1.Prueba_01Client ins = new ServiceReference1.Prueba_01Client();
                //ins.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
    
                Label1.Text = ins.mostrarServicio();
    
    Esto a que se debe que funcione con esa línea comentada?
    

    Esto a que se debe? que no se supone que esa línea manda la credencial? o como es la cosa?


    Roy Sillerico

    jueves, 15 de octubre de 2015 20:41