2009-07-07 29 views
9

Tengo un servicio web con varios métodos que me gustaría asegurar. Los datos no son del todo confidenciales, pero me gustaría restringir el acceso solo a aquellos que usan una determinada identificación de usuario y contraseña que está almacenada en el archivo web.config de servicios web. Un cliente del servicio de Windows C llamará a este servicio web una vez al día o a la semana.servicio web asmx: autenticación de cliente

¿Alguien puede publicar un ejemplo simple de cómo puedo hacer esto? Gracias por adelantado.

Respuesta

3

Hay tres enfoques generales para la seguridad SOAP de Ad hoc:

  1. La primera es pasar la información de autenticación con cada llamada.
  2. El segundo es pasarlo una vez para recibir una ID de sesión que luego se pasa con cada llamada.
  3. El tercero es esencialmente el mismo que el segundo, solo usa cookies.

De los tres, recomiendo el primer método, que no requiere el servidor para mantener el estado, pero puede ser tan rápido debido al almacenamiento en caché.

+0

Por ID de sesión, ¿se refiere a la seguridad basada en token? Eso es lo que típicamente oigo a lo que se hace referencia. También ese "primer método" puede ser muy diferente y completamente ineficaz dependiendo de cómo lo configure. Es decir. Autenticación básica sin HTTPS que no tiene valor ya que el inicio de sesión y la contraseña se envían en texto sin formato. –

+0

Más o menos, aunque puede ser tan simple como un GUID. Lo que importa es que es grande y efectivamente aleatorio, por lo que no puede ser afectado. No necesita enviar nada en texto sin formato, tampoco.Por ejemplo, podría llamar a GetChallenge para recibir un GUID, luego llamar a LoginWithResponse, pasar ese GUID, junto con el nombre de la cuenta de texto claro y el hash de la concatenación del GUID, la cuenta y la contraseña. O, por supuesto, podría usar HTTPS, que lo resuelve desde otra dirección. –

9

Esto es bastante similar a mi pregunta: "What should we implement to authorize clients to use our web service?"

Al final no publicar el WSDL y sólo sirviendo el servicio a través de https y que requieren basic authentication. NO use autenticación básica si no puede obligar a todos los clientes a usar https.

Si se trata de un servicio web .net, aquí está la entrada del archivo de configuración para evitar que se publique el wsdl.

<system.web> 
    <webServices> 
     <protocols> 
     <remove name="Documentation" /> 
     </protocols> 
    </webServices> 
    </system.web> 

Cuando Ir a la página, recibirá un mensaje de error similar al mensaje se obtendría si se trató de tirar de forma manual por un web.config de un sitio. Como Steven señala, esto es seguridad a través de la oscuridad y NO debe usarse solo para proteger su servicio web. Sin embargo, cuando se usa además de auth + https básico, es un pequeño extra.

Clientes Código lateral:

Para acceder a este servicio web de un cliente, añada su web de referencia de la forma habitual y en el código de llamada (asumiendo que su web de referencia se denomina webref).

WebRef.Url = "url"; 
WebRef.Credentials = new System.Net.NetworkCredential("userid", "password"); 

Además, es posible que desee consultar WebRef.PreAuthenticate para guardar algunos viajes redondos. Solo ten en cuenta que te divertirás probando eso si estás detrás de un proxy corporativo. Los proxies se utilizan a través de WebRef por

WebRef.Proxy = new WebProxy("url"); 
WebRef.Proxy.Credentials = new System.Net.NetworkCredential("userid", "password"); 
+0

Este no es un paso adicional irrazonable, pero es la seguridad por la oscuridad, ya que nada sobre https autentica al cliente, por lo que todo se desmorona en el momento en que se descubre la URL del servidor (y lo será). Habiendo dicho eso, requerir https y usar autenticación básica es razonable. –

+2

Absolutamente, no publicar el WSDL es seguridad a través de la oscuridad. Sin embargo, https + basic auth + parte de la seguridad incorporada en el código del servicio web en sí no es seguridad por oscuridad. Si se descubre la URL, no tendrán el WSDL, que es lo que se deseaba. –

+0

No tengo acceso al servidor donde residirá el servicio web, por lo que no estoy seguro de si podrán configurar el acceso https only. ¿Hay algún otro método que puedas recomendar? – zSynopsis

Cuestiones relacionadas