Autenticación de aplicaciones de una sola página

Mi empresa está reescribiendo su sitio de comercio electrónico como una aplicación de una sola página usando las nuevas características de API web/SPA en MVC 4. No estamos seguros de cuál es la mejor manera de manejar la autenticación.

Preguntás especificas:

  1. ¿Cómo manejamos la comunicación cifrada y no cifrada? Claramente, necesitamos usar HTTPS para el inicio de sesión, la cuenta y el pago de AJAX, pero nos gustaría usar HTTP para navegar por el catálogo a fin de evitar costosos protocolos de enlace SSL que ralentizarían todo el sitio. ¿Es esto posible para un SPA, o estamos atascados con HTTPS para todo?

  2. ¿Qué tipo de autenticación debemos utilizar? Principalmente, se accederá a nuestro sitio desde un navegador web, por lo que las cookies pueden estar bien. Pero en el futuro, es posible que queramos hacer una aplicación de iPhone personalizada. ¿Es preferible la autenticación básica, OpenId u OAUTH? Si es así, ¿por qué?

    1. Si vamos con Forms Auth y cookies, ¿el problema de redireccionamiento arreglarse para el lanzamiento de MVC 4, o tengo que usar el truco?
    2. Si optamos por la autenticación básica, ¿cómo se realizan las sesiones persistentes para que los usuarios no tengan que iniciar sesión cada vez que visitan la página nuevamente?
    3. Qué métodos de autenticación son compatibles con ASP.NET MVC 4. Sería ideal no tener que escribir mucho código especializado.

Gracias por adelantado

preguntado el 22 de mayo de 12 a las 21:05

¿Por qué, por el amor de $DEITY, construirías un sitio de comercio electrónico como un SPA? -

¡Porque es una muy buena idea si se hace bien! -

¿Qué usaste finalmente para esta aplicación? -

Terminamos yendo todo SSL y usando autenticación básica. -

3 Respuestas

1. ¿Cómo manejamos la comunicación cifrada y no cifrada? ¿Estamos atascados con un protocolo, https, con un spa?

No estás atascado con un protocolo. Con un spa, puede usar ajax para comunicarse a través de http o https, cualquiera que elija en un momento dado. Usaría https cada vez que envíe información confidencial, como el nombre de una persona, su fecha de nacimiento o sus credenciales de inicio de sesión.

Una vez que un usuario inicia sesión en su sitio a través de https, su servidor puede configurar una cookie de autenticación de formularios para ese usuario. Esta cookie debe ser un valor encriptado que vincule su sesión al servidor. Debe tener en cuenta que si el resto de su sitio utiliza http, entonces corre el riesgo de que esta cookie se transmita en texto sin formato. A pesar de que el contenido de la cookie se puede cifrar mediante un algoritmo de cifrado de su elección, una persona malintencionada puede robar esta cookie y secuestrar la sesión de su usuario.

Sin embargo, esto podría no ser un gran problema para usted si solo se les permite navegar por el sitio y crear un carrito de compras. Una vez que el usuario esté listo para pagar, debe volver a autenticar al usuario, a través de https, como una especie de verificación doble para asegurarse de que no sea un usuario malicioso. Amazon hace esto.

2. ¿Qué tipo de autenticación debemos usar?

Bueno, eso es todo una cuestión de qué funciones desea que tenga su sitio.

OAuth es para exponer servicios web a los que puede permitir que otros sitios llamen con acceso delegado. Lo que esto significa es que si tiene un usuario que quiere otro sitio (sitio x) podrá acceder a las funciones de su sitio para su perfil. El sitio x puede redirigir al usuario a un punto final de autenticación en su sitio que autenticará al usuario. Su punto final de autenticación le preguntará al usuario si está de acuerdo con que ciertas funciones se compartan con el sitio x y, si el usuario está de acuerdo, se generará un token. El usuario pasa este token al sitio x, donde el sitio x hará llamadas de servidor a servidor a su sitio. El sitio x presentará el token en las llamadas, por lo que las llamadas a sus servicios serán llamadas de acceso delegado. OAuth es una forma de aprovisionar otros sitios para delegar el acceso a sus servicios. Espero haber podido explicarlo claramente... No siempre soy bueno en esto.

Open ID no es una forma muy segura de manejar la autenticación, es más conveniente para que los usuarios no tengan que preocuparse por registrar una cuenta en su sitio. Debido a que OpenID es completamente abierto, confía en otro proveedor para validar a sus usuarios. Si el almacén de usuarios del proveedor externo se ve comprometido, sus usuarios también se verán comprometidos. Es un ejemplo de un sistema de vales en el que básicamente estás diciendo que confiaré en quién dices que eres, si puedes tener un proveedor de OpenID que responda por ti.

Otra solución es Federación WS. WS-Federation es si tiene varios sitios y desea tener 1 proveedor de autenticación en el que confíe. Este proveedor de autenticación puede ser suyo y, básicamente, todos sus sitios dicen que si desea acceder a mi sitio, primero debe autenticarse con mi proveedor de autenticación. Este proveedor de autenticación puede vivir en un dominio separado y puede elegir cualquier mecanismo de autenticación que elija. Confía en que este proveedor de autenticación hará su mejor trabajo para administrar las cuentas de sus usuarios.

Sin embargo, WS-Federation puede ser excesivo si solo desea autenticación en su sitio y no tiene varios sitios. En ese caso, solo recomendaría hacer Autenticación de formularios y esto debería ser bastante simple de hacer. Hay muchos ejemplos de cómo hacer esto y Microsoft proporciona muchas soluciones para hacerlo. Debería considerar la creación de un proveedor de membresía personalizado.


Una vez que un usuario se haya autenticado en su sitio, debe crear un cookie de autenticación de formularios. Esta cookie vincula al usuario a su sesión en el servidor. Esto se aplica a todos los escenarios enumerados anteriormente. MVC 4 también es compatible con todos los escenarios enumerados anteriormente.

Gracias, y siéntete libre de hacer más preguntas si no fui lo suficientemente claro.

** EDITAR 12/1/2017 ** Volviendo a esta pregunta años después, aprendí que confiar en las cookies para las API basadas en REST no es una buena idea. No desea crear una sesión en su aplicación web porque hace que su aplicación sea más difícil de escalar. Entonces, si necesita autenticación, use HTTPS con alguna forma de autenticación (BASIC, DIGEST, Token Based, etc.). Por lo tanto, su aplicación de cliente SPA establecerá el encabezado de Autorización en cada solicitud http y luego su aplicación de servidor web volverá a autenticar cada solicitud.

Respondido el 01 de diciembre de 17 a las 14:12

La principal desventaja de usar la seguridad basada en formularios de ASP.NET es que asume que desea una página web 401 cuando falla su autenticación (inútil cuando está haciendo una llamada AJAX) y realmente está diseñado para hacer redirecciones que rompen todo Patrón de spa. Puede piratearlo, pero no está diseñado para el propósito que lo está usando.

Este conjunto de herramientas puede proporcionar una alternativa a ASP.NET como modelo de formulario. Todavía no estoy seguro de qué tan maduro es...

http://www.fluentsecurity.net

Comentarios bienvenidos.

Respondido 20 Feb 13, 06:02

Acabo de empezar a trabajar con webapi, así que no consideres mi respuesta autoritaria. No soy un experto en seguridad, aunque debería serlo. Me encontré con las mismas preguntas que tú y descubrí, al igual que tú, que había is Sin embargo, no hay una respuesta autorizada, dentro de mvc webapi en cualquier caso. Mirar otras especificaciones de webapi puede darle algo de inspiración.

La forma más sencilla que encontré fue, por supuesto, usando SSL. Eso le permite enviar credenciales en texto claro en el encabezado. No rompe el descanso.

Mi api empleará SSL todo el tiempo, pero quería duplicar de todos modos. Así que envío una clave cifrada en la cadena de consulta para todas mis solicitudes. Más o menos de la forma en que funciona la autenticación sin cookies para un sitio ASP sin API, pero mvc no juega con él, así que he implementado mi propia solución.

En un sitio móvil, el usuario iniciaría sesión y sería redirigido a la aplicación con la clave cifrada codificada en js. Entonces, inicialmente tendrá una autenticación basada en cookies para el sitio y será responsable de su protección, guardado de contraseña, etc.

Otro consumidor de API obtendría un "secreto" más permanente de un sitio de desarrollo aún por crear y lo usaría para verificar una clave.

Normalmente, la autenticación de mvc no tiene estado, lo que significa que el ticket nunca se invalida del lado del servidor. Si controla al cliente, puede ignorar las solicitudes de cookies invalidadas si el servidor cierra la sesión y seguir reutilizando el ticket. Eventualmente, es posible que desee realizar un seguimiento del lado del servidor de tickets, pero no es apátrida, dude si está lleno y, en consecuencia, la escalabilidad se ve afectada. Pero la autenticación es bastante importante, así que...

Respondido el 01 de junio de 12 a las 07:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.