2010-07-21 25 views
7

Tenemos una aplicación web que no tiene estado. Estamos utilizando http autenticación a través de SSL/TLS. Los navegadores del usuario son que presumiblemente almacenan credenciales de autenticación (posiblemente incluso después de que el navegador se apaga si configuran sus navegadores de esa manera). Validamos en cada acceso.¿Puede mi aplicación web implementar el inicio de sesión de usuario y permanecer sin estado?

Por razones que principalmente tienen que ver con la usabilidad, nos gustaría para dejar de usar la autenticación http. ¿Existe una forma razonable de para implementar el inicio de sesión de usuario y

  • Permanecer sin estado.
  • No requiere que los usuarios vuelvan a escribir las credenciales en cada acceso.
  • Sea al menos tan seguro como la autenticación http sobre SSL/TLS.

Por ejemplo, estamos dispuestos a utilizar cookies, y podríamos almacenar el nombre de usuario y la contraseña como una cookie. Sin embargo, esto parece menos seguro . ¿Pero es? Si utilizamos una cookie no persistente, ¿es menos seguro que cualquier otro método que utilice un navegador para almacenar las credenciales durante la sesión o más?

Podríamos almacenar el nombre de usuario y un hash de la contraseña como se sugiere aquí: What should I store in cookies to implement "Remember me" during user login ¿pero es eso mejor?

Podríamos almacenar un token aleatorio como una cookie, pero luego tenemos que mantener una tabla de búsqueda (sesión) en el servidor y convertirnos en con estado.

Podríamos almacenar una versión encriptada de las credenciales como una cookie y luego descifrar y validar en cada acceso. Este parece como que es un poco más seguro que la autenticación http y tampoco requiere estado. Sin embargo, estoy no estoy seguro de que desee la sobrecarga adicional de descifrado. ¿Y es realmente más seguro? Si alguien obtiene una copia de la cadena encriptada (o hash, como arriba), ¿no les da el mismo acceso como si tuvieran la contraseña?

lo agradecería sus pensamientos, pero vamos a empezar con la suposición de que autenticación HTTP sobre SSL/TLS es seguro suficiente para nuestros propósitos y queremos permanecer sin estado.

EDITAR

Después de algunas investigaciones más, creo que esta pregunta StackOverflow: Client side sessions plantea el problema mucho mejor, y las respuestas son relativamente mejor así. Gracias a todos por su aporte.

+0

¿Qué software está utilizando como servidor y base de datos, así como con qué idioma está generando las páginas? – sigint

+0

@sigint, la aplicación está escrita en PHP en Apache. No hay base de datos. ¿Por qué? ? – bmb

+1

Si otros usuarios (SO) saben qué herramientas tiene su disposa Intentarán proporcionarle una solución que utilice esas herramientas. – sigint

Respuesta

-2

No veo un token aleatorio como más o menos sin estado que un nombre de usuario y contraseña.

Ambos deben buscarse en alguna forma de base de datos. Su aplicación ya tenía estado. El estado de ser autenticado o no autenticado.

El nombre de usuario y la contraseña que se estaban enviando eran exactamente los mismos que un token aleatorio.

Así que mi respuesta a su pregunta es No. Una aplicación web no puede implementar ninguna forma de autenticación de usuario y permanece sin estado.

+0

No creo que la aplicación tenga estado. No almacena el estado de "autenticarse o no autenticarse" en las solicitudes. Cada solicitud se vuelve a autenticar. – bmb

+0

@bmb: por supuesto, es el estado de almacenamiento. En el servidor hay una base de datos de quién está autenticado, que capta el estado actual de cada solicitud. –

+0

si por estado, quiere decir quién tiene una cuenta con nosotros, entonces sí, almacenamos ese estado. Pero no almacenamos una base de datos de quién está autenticado en una solicitud que leemos en una solicitud posterior. La solicitud posterior realiza una nueva autenticación. – bmb

-1

Es posible que desee buscar en PHP sessions como una alternativa a las cookies.

Puede iniciar una sesión con una sola llamada al session_start().

Desde allí puede almacenar los datos que desee sobre el usuario con la matriz global $_SESSION.

Esto no tiene en cuenta CÓMO va a autenticar usuarios en primer lugar. Esto se hace generalmente buscando hashes almacenados de nombres de usuario/contraseñas en una base de datos.

1

En un sistema cerrado (intranets de la compañía, o simplemente un sitio normal pero con una pequeña y decente cantidad de gente inteligente) sería preferible validar por certificado SSL. Emita un certificado para cada usuario, permítales instalarlo en sus navegadores, y puede revocar el acceso para ese certificado en cualquier momento (vea por ejemplo el sistema de identificación ssl-cert de myopenid.com (lamentablemente con error).

Se requeriría algo de trabajo por parte de los usuarios, y si eso no es posible/deseable, una cookie-token sería mucho más preferible, y si busca un combo user/passwd o un token de cookie no debería hacer tanto una diferencia

+0

no tenemos un sistema cerrado, por lo que los certificados instalados por el usuario no son una opción. La diferencia que veo entre un "token" de cookies (si estamos hablando de algo aleatorio) y el usuario/contraseña es que el token necesita ser regenerado y almacenado en el servidor en cada solicitud. No tengo que actualizar el usuario/contraseña en el servidor en cada solicitud. – bmb

Cuestiones relacionadas