2010-09-08 16 views
5

El contexto:¿Puede una aplicación local html5 tener una sesión asp.net? (Aplicación web local para iPhone)

En realidad estoy desarrollando una pequeña aplicación web (C#/MVC2). Los usuarios van a usar sus iPhones (y probablemente teléfonos Android en el futuro) para acceder a ellos.

Por el momento es bastante simple (solo muestra información y reportes del ERP de nuestro cliente), y decidí intentar crear una aplicación web local que los usuarios pudieran agregar a sus iPhones, para que tuvieran un ícono para ello y, lo que es más importante, la mayoría de los archivos se almacenan en caché localmente, de modo que solo se obtienen los datos relevantes utilizando json del servidor.

El problema:

para autenticar usuarios, un pequeño formulario pide el nombre de usuario y contraseña, y los envía al servidor a través de AJAX, que a su vez valida el usuario y establece el authcookie. Si la aplicación se ejecuta en Safari, todo funciona bien, pero si se ejecuta localmente (es decir, en Mobile Safari directamente desde un icono), el servidor valida correctamente al usuario, pero esta validación se pierde cuando la próxima llamada ajax recupera datos. está hecho.

¿Esto significa que las cookies de sesión no son compatibles con Mobile Safari en webapps? Lo estoy haciendo mal?

Y lo más importante: ¿Cuál es la mejor manera de autenticar usuarios en una aplicación web local que accede a datos remotos?

Respuesta

0

No estoy seguro de a qué se refiere con webapp local. Supongo que es un servidor web HTTP ejecutándose en localhost.

Si ese es el caso, necesita algún protocolo para comunicarse entre http://localhost y http://yourwebsite.com, y ese protocolo debería ayudar a localhost a autenticar al usuario a través de yourwebsite.com. Creo que OAuth podría ser lo que estás buscando.

La primera vez que el usuario acceda a su aplicación web local, será redirigido a yourwebsite.com para la autenticación. Después de eso, yourwebsite.com lo traerá de vuelta con un token de OAuth. Después de verificar que token es válido desde yourwebsite.com, localhost puede servir al usuario por sí mismo.

+0

Gracias, pero por desgracia yo estoy hablando de aplicaciones fuera de línea HTML5. Son páginas HTML que se pueden almacenar en el teléfono, pueden trabajar sin conexión, tienen su propio icono en el área de trabajo y se comportan como una aplicación nativa (no se obtiene el navegador Chrome). – salgiza

0

(Me doy cuenta de que soy muy tarde para esta pregunta, pero de todos modos ...)

Mobile Safari emplea un motor web ligeramente diferente a la utilizada en "Aplicaciones-pantalla de inicio" (es decir, las páginas web que se marcador como iconos independientes en la pantalla de inicio de iOS).

Tal vez el problema que está viendo con las cookies proviene de eso, en lugar de en Mobile Safari per se? Supongo que es bastante fácil de probar: si la aplicación funciona bien en Mobile Safari, y no desde un icono de la pantalla de inicio, ahí está tu respuesta.

Como alternativa, en lugar de confiar en la autenticación en la versión en línea de la aplicación, otro enfoque que puede funcionar para usted/su organización es usar la aplicación en un estado no autenticado, pero a través de una VPN para trabajadores móviles ? (Esto seguirá funcionando bien como una aplicación web fuera de línea).

+0

Gracias por su respuesta. Efectivamente, es un problema con la forma en que se tratan las aplicaciones de la pantalla de inicio. En este momento están usando la aplicación en Mobile Safari, pero idealmente deberían poder usarla desde un ícono (el estado de la pantalla es importante en un dispositivo móvil, y no necesitamos la barra del navegador para nada). – salgiza

+0

Mmmm ... debería haber una manera de agregar nuevas líneas en un comentario, pero estoy divagando. Deberíamos usar VPN (para encriptar la conexión), pero la sesión de cookies también es necesaria porque almacenamos valores en la sesión del servidor (y necesitamos conocer la identidad del usuario que accede a la aplicación por diferentes razones). Probablemente vayamos con un token de validación si tenemos tiempo en el futuro (básicamente, será similar a una cookie, pero se enviará explícitamente con cada llamada Ajax). – salgiza

0

En lugar de utilizar una cookie, no puede tener una llamada ajax para iniciar sesión que solo devuelve el valor "authcookie". El valor se puede guardar usando localStorage o similar.

http://dev.w3.org/html5/webstorage/

Más tarde cuando se quiere buscar algo que puede enviar este valor al servidor mediante un encabezado personalizado (X-autenticación o similar) o simplemente añadirlo como un GET-variable a la url.

+0

Este sitio puede ayudarlo a comenzar: http://diveintohtml5.org/storage.html –

+0

Gracias, ya usamos el almacenamiento local para muchas cosas en la aplicación. El hecho es que el uso de sesiones basadas en cookies es la forma estándar de autorizar a los usuarios en .Net MVC (y en general en cualquier otro lugar). Crear nuestro propio sistema basado en tokens no debería ser demasiado difícil (y probablemente lo hagamos en el futuro), pero es bastante extraño que las aplicaciones web locales (en el iPhone) no admitan cookies (y por lo tanto sesiones basadas en cookies) . – salgiza

0

Su mejor apuesta: http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

Para acceder a un recurso protegido, el cliente incluye el token de acceso en el encabezado de autorización de la solicitud HTTP

ingreso:

var loginData = { 
    grant_type: 'password', 
    username: ..., 
    password: ... 
}; 

$.ajax({ 
    type: 'POST', 
    url: '/Token', 
    data: loginData 
}).done(function (data) { 
    // Cache the access token in session storage. 
    sessionStorage.setItem(tokenKey, data.access_token); 
}); 

Segunda solicitud:

// If we already have a bearer token, set the Authorization header. 
var token = sessionStorage.getItem(tokenKey); 
var headers = {}; 
if (token) { 
    headers.Authorization = 'Bearer ' + token; 
} 

$.ajax({ 
type: 'GET', 
url: 'api/values/1', 
headers: headers 
}).done(function (data) {}); 

Si no va a utilizar la API de Web, debe generar su propio token y lo puso en cada solicitud de datos

Cuestiones relacionadas