2011-09-07 13 views
9

Estamos en proceso de crear una nueva pila de aplicaciones web. La funcionalidad del back-end estará fuertemente basada en el servicio, pero como algunos de estos servicios deberán estar expuestos a Internet pública, tendré que asegurarlos. En parte, tuve éxito al bloquear las URL de servicio utilizando el modelo estándar de membresía/proveedor de funciones. La parte con la que estoy teniendo problemas por el momento es si alguna vez construimos una aplicación iOS (o Android) sobre nuestra Pila de Servicios, ¿cómo podríamos manejar la seguridad?¿Cómo debo proteger mi WCF Rest/JSON Services para su uso con una aplicación iOS/Android?

Estoy abierto a sugerencias. He incluido algo de información a continuación sobre la configuración hasta el momento.

  1. ASP.NET Sitio web que utiliza Membresía/Proveedor de rol/Autenticación de formularios que se ejecuta en una conexión HTTPS. Solo las páginas predeterminadas/de inicio de sesión/preguntas frecuentes son públicamente accesibles. Todas las otras páginas viven en una carpeta llamada "/ Secure" que requiere que se autentique.

  2. WCF WebService. Toda la funcionalidad respaldada se proporciona a través de este servicio. Los puntos finales solo están disponibles en la intranet local. el código de sitio web de ASP.NET detrás se comunica con el servicio utilizando una referencia de servicio estándar.

  3. WCF REST/JSON Services. Algunas de las funciones anteriores se vuelven a empaquetar en un servicio WCF REST/JSON. Esto se configuró usando el "WCF REST Template 40". El servicio se enruta usando System.Web.Routing a "/ Secure/jsonsvc/*". Debido a que esto se encuentra debajo de la carpeta/Secure, hereda la seguridad de miembro/rolprovider para cualquier solicitud. p.ej. Las llamadas xmlhttp a este servicio desde un widget JQuery del lado del cliente solo funcionarían para los usuarios que ya iniciaron sesión en nuestro sitio.

  4. En el futuro, es posible que estos mismos servicios de WCF Rest/JSON deban ser consumidos por una aplicación externa (por ejemplo, una aplicación de IPad). ¿Cuál sería la mejor manera de abordar esto, dada la falta de un contexto HTTP de sitio/sesión/inicio de sesión?

+0

El mecanismo de autenticación que mencionó en el n. ° 1, ¿también está expuesto como parte del servicio web en el n. ° 3? – momo

+0

¿Quiere decir ... hay una versión de servicio web del método de inicio de sesión del Proveedor de Membresía. No, no hay. y no estoy seguro de cómo eso funcionaría. Incluso si expuse un método que requiere un nombre de usuario y una contraseña, ¿qué devolvería? La versión actual da como resultado el valor de la cookie ASPXAUTH como parte de las solicitudes en el navegador xmlhttp. cómo simularías eso en un cliente nativo. –

+0

Para la mayoría de las aplicaciones que creamos, la llamada de inicio de sesión del servicio web devolverá un token de sesión que las llamadas posteriores al servicio web deben incluir.Puede que le interese la pregunta que recientemente contesté http://stackoverflow.com/questions/7296729/handling-login-functionality-for-native-app-connecting-to-web-service/7296764#7296764. Podría ser aplicable a su caso. – momo

Respuesta

11

Como sabe, la autenticación de formularios ASP.NET utiliza una cookie para mantener su sesión autenticada. Dejando de lado cualquier argumento en cuanto a si esta es la mejor manera de manejar las cosas bajo una metodología REST, no veo ninguna razón técnica por la que no puedas usar la misma cookie en tu aplicación iOS.

Obviamente, necesitaría una página web simple de inicio de sesión (que se muestra en su aplicación a través de UIWebView) o un método REST de inicio de sesión para devolver la cookie en primer lugar, y luego en las siguientes solicitudes simplemente devuelva la cookie con la solicitud (aquí hay un poco de information on handling cookies in iOS using the ASIHTTP library).

Un par de cosas importantes a tener en cuenta es que no tiene ningún control sobre la red inalámbrica en la que está el dispositivo, por lo que definitivamente debe usar SSL y también debe tener en cuenta las fallas/reintentos/etc. para un método REST de inicio de sesión tal como lo haría para una página de inicio de sesión (si no más).

Espero que ayude!

+2

+1 Buena publicación. Examine la [Clase de autenticación de formularios] (http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.aspx). Debería poder llamar a ['Authenticate'] (http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.authenticate.aspx) y a [' SetAuthCookie'] (http://msdn.microsoft.com/en-us/library/twk5762b.aspx) de un servicio web que existe fuera de sus otros servicios wcf protegidos. Una vez autenticado, solo asegúrese de estar pasando la cookie de autenticación en las solicitudes posteriores. – Sam

Cuestiones relacionadas