2009-10-23 14 views
6

Estoy designando un servicio web RESTful (JBoss + RESTeasy). El programador de UI está escribiendo una aplicación web Ajax que lo usará. La aplicación web será una página HTML con todo lo hecho en JavaScript. Por seguridad, todo el tráfico pasa por SSL.Autenticación Ajax sin dejar que aparezca el diálogo de inicio de sesión del navegador

Actualmente estoy usando autenticación básica. El programador de la interfaz de usuario puede mostrar un cuadro de diálogo para obtener un nombre de usuario y una contraseña y colocar "Autorización: Basic xxxxx" en el encabezado. Lamentablemente, si la contraseña es incorrecta, aparece el feo cuadro de diálogo de inicio de sesión del navegador. Además, no hay forma de que el usuario cierre la sesión. Esto es inaceptable.

Parece que no hay forma de interceptar una respuesta 401 a XMLHttpRequest en cualquiera de los navegadores que utilizaremos.

La autenticación basada en el formulario no funcionará para nosotros. Necesitamos un cierre de sesión automático después de un período de inactividad (el equivalente a un tiempo de espera de sesión). No podemos hacer que el servidor devuelva repentinamente una página de inicio de sesión cuando el cliente espera un objeto JSON.

JBoss ofrece cuatro estrategias de autenticación: BASIC, FORM, CLIENT-CERT y DIGEST. Creo que DIGEST tiene el mismo problema que BASIC. Ninguno de los cuatro es lo que queremos.

Esta aplicación web será el único cliente (por ahora), por lo que no es obligatorio utilizar BASIC. ¿Hay alguna otra estrategia de autenticación que pueda instalar? Por ejemplo, ¿hay alguna implementación de WSSE UsernameToken que pueda usar? (Como se describe en el Capítulo 8 del libro O'Reilly RESTful Web Services.) El servidor enviaría "WSSE" en lugar de "Básico" en el encabezado WWW-Authenticate y, presumiblemente, el navegador lo ignoraría y lo pasaría directamente.

Quiero configurar la seguridad donde pertenece, en los archivos de configuración de JBoss, no en mi servicio web RESTful, entonces estoy buscando una implementación que pueda simplemente conectar a JBoss.

Respuesta

7

El navegador no presentará el cuadro de diálogo de contraseña si no reconoce el esquema de autenticación en el encabezado WWW-Authenticate. Su mejor opción puede ser continuar usando autenticación básica en el servidor mientras configura el encabezado manualmente en algo como "Básico/MiAplicación" para 401 respuestas.

+0

La autenticación se realiza antes de que la solicitud llegue al servicio web. ¿Puedo manejar esto escribiendo un filtro que se encuentra frente al marco de seguridad? Entonces podría decirle al programador web que agregue un encabezado "Autorización: Básica/MiApp" a la primera solicitud. El filtro podría reescribirlo como "Autorización: Básica" y reescribir el encabezado "WWW-Authenticate: Basic" en la respuesta como "WWW-Authenticate: Basic/MyApp". Cualquier otro cliente podría usar la autenticación básica normal. esto funcionara? Creo que podría. –

+0

Hmm ... suponía que tenía control sobre la autenticación a nivel de script en el servidor, y el encabezado se configuraría después de que se manejara la autenticación, pero antes de que usted respondiera. No estoy muy familiarizado con JBoss, pero si puedes filtrar y reescribir las solicitudes antes de que ocurra la autenticación, parece que sería tu mejor opción. Y al configurar el encabezado Authorization en la aplicación web, los clientes normales no se verán afectados. Bonito. –

+0

Como resultado, no puede tener un filtro de inicio de sesión previo. El servidor de WebLogic lo permite, pero el estándar no lo permite y JBoss y Tomcat no lo permiten. Parece que tendré que jugar con JAAS para hacer esto. –

Cuestiones relacionadas