2011-03-08 18 views
6

Estoy haciendo una reconstrucción de un sitio web y estoy tratando de usar un enfoque SOA. El sitio web actual está en .NET 2.0 y usa el SqlMembershipProvider.Autenticación con un enfoque SOA usando C#

Estamos tratando de eliminar las conexiones directas a la base de datos y empujar todo a través de una capa de servicio WCF. El enfoque que estamos usando para esto es tener todo separado: hay una biblioteca para modelos e interfaces, una biblioteca para los servicios y luego una biblioteca para los servidores proxy de servicio.

El mayor obstáculo hasta ahora es descubrir cómo administrar la autenticación de usuario y su sesión. ¿Cuál es la mejor manera de hacer esto con este enfoque?

¿Deberíamos eliminar el modelo de membresía .NET e ir con algo así como OpenId, y simplemente permitir que los usuarios vuelvan a conectar sus datos a la nueva cuenta?

He hecho algunas búsquedas y no puedo encontrar mucho sobre cómo gestionar esto, aunque sé que ya se ha hecho antes.

Respuesta

1

Esto es lo que terminé haciendo, en caso de que alguien esté interesado. Empecé utilizando los Servicios de Autenticación WCF, pero luego me di cuenta de que no me daba todo lo que quería.Podría iniciar y cerrar sesión, pero aún así tendré que crear mis propios métodos para registrarme y obtener MembershipUser.

Y fui en mi biblioteca ServiceContracts y crear una interfaz llamé IMembership. Al principio, lo creé como una clase y lo heredé de MembershipProvider para poder obtener todos los stubs de métodos generados por mí. Una vez que se generaron, modifiqué los talones y los convertí en una interfaz.

Luego entré en mi Biblioteca Servicios y creó la aplicación para la interfaz que era sencillo, ya que para la puesta en práctica acabo de utilizar Membership.Provider ....

Luego, en mi biblioteca de Servicio Clientes proveedor, lo hice la implementación habitual de la interfaz IMembership, también hereda de ClientBase <>. Justo al lado, creé un WCFMembershipProvider, que implementó MembershipProvider, y llamé a los métodos desde el MembershipClient que acabo de crear.

En mi WebApp que aloja los Servicios de WCF configuré mi proveedor de Membresía SQL en el web.config, y luego creé mi archivo svc y puntos finales para el servicio.

En la aplicación web que consume, acabo de agregar la referencia del cliente del servicio al servidor y luego configuré el proveedor de membresía para mi WCFMembershipProvider.

y Viola - Estoy en el negocio.

Una gran cantidad de código repetitivo, pero funciona bien.

+0

Probablemente podría resumir esto un poco más, pero funciona para lo que necesito en este momento. – Doug

0

El problema principal con el que se encontrará al intentar crear un servicio WCF y mantener el estado de sesión equivalente es que no hay cookies (ya que no hay un navegador para mantenerlas), por lo que los proveedores de membresía de .NET no va a ser terriblemente útil por defecto. Sé cómo he manejado el problema equivalente es tener un token generado (por ejemplo, un Guid) corresponde con la información del estado que necesito mantener.

Su pregunta, sin embargo, es más acerca de la autenticación. No sé si usted podría hacer que una implementación de OpenId funcione a través de WCF (aunque entiendo que funciona muy bien para ASPX antiguo). Puede usar solo un esquema simple de autenticación de nombre de usuario/contraseña (posiblemente usando MembershipProvider manualmente, si lo necesita para tratar el cifrado de contraseña en la base de datos), y puede pasar el nombre de usuario y la contraseña a través del servicio usando (lo más probable) Transporte seguridad (SSL).

Espero que esto ayude un poco. Tal vez alguien haya presentado un reemplazo de estado de sesión más estándar para WCF, pero de eso no estoy al tanto.

0

Difícil de proporcionar una respuesta específica sin saber un poco más acerca de la configuración deseada.

¿Piensa exponer su servicio WCF como un público accesible independientemente de su sitio web? ¿Sus páginas web accederán a su servicio WCF directamente a través de AJAX?

El escenario más fácil es probablemente una implementación en capas estricta. La interfaz de usuario solo se comunica con el sitio web, solo el sitio web habla con el Servicio WCF.

http://msdn.microsoft.com/en-us/library/ms731049.aspx es una buena lectura sobre el uso del modelo de membresía ASP.NET con WCF.

Creé un sitio que usaba AJAX para hablar con la capa de servicio de WCF. Usamos el proveedor de autenticación de formularios con WCF. Funcionó bien, excepto que no había una manera elegante de manejar el inicio de sesión a través de un servicio web. En nuestro caso, eso estuvo bien, ya que queríamos que el usuario acceda al sitio web e ingrese sus credenciales.

Si ya ha invertido en la recopilación de credenciales de usuario para trabajar con el proveedor de SQLMembership, puede hacerlo a través de un modelo basado en notificaciones ADFS +. Esto funcionaría con los 3 escenarios anteriores. Hay un poco de aprendizaje que hacer aunque

+0

Bueno, básicamente lo que estoy tratando de lograr es reemplazar el proveedor de pertenencia SQL con un proveedor de suscripciones WCF. Estoy tratando de eliminar todas las conexiones directas a los servidores SQL internos de mi DMZ, y solo uso los servicios. He mirado en el servicio de autenticación que se ofrece con WCF, pero no parece ser una manera fácil de implementar que en mi propia biblioteca cliente proxy sin poner el despliegue del servicio y el uso de la herramienta de línea de comandos para crear mi representante, que me quiero evitar Probablemente terminaré creando mis servicios para autenticación y creando un proveedor personalizado para interactuar con él. – Doug

+0

Una pregunta basada en su respuesta. Si tan sólo su sitio web (y ningún otro cuerpo) necesita hablar con su servicio WCF, ¿por qué desea utilizar las credenciales del usuario que se utilizará para la autenticación en cada llamada de servicio web? Esto en esencia (por ejemplo) significaría que tendría que guardar la contraseña del usuario en una variable de sesión y pasarla a cada llamada de servicio. – Naraen

Cuestiones relacionadas