2010-03-30 28 views
12

Mi empresa tomó alguna aplicación anterior de php. Debido a nuestra preferencia por ASP.net y por la falta de documentación del desarrollador anterior, no queremos gastar muchos recursos en desarrollar en PHP. Para implementar nuevas características, crearemos una aplicación Asp.net que tenga el mismo aspecto para el usuario. Queremos desarrollar una especie de aplicación web 'coexistente'. Por lo tanto, debemos compartir sesiones entre un proyecto de aplicación web PHP y Asp.net, porque hay una administración de usuario relacionada con una base de datos MySQL existente.¿Cómo compartir sesiones entre PHP y la aplicación ASP.net?

(por ejemplo, enlace 'A' dirige a la página web de PHP, y el enlace 'B' dirige a la aplicación asp.net)

¿Cómo podemos compartir la sesión entre y PHP y una aplicación asp.net?

¿Alguien tiene una pista para esta cosa "coexistente" que podría ser útil en el desarrollo?

Editar: IIS 6 sería nuestro servidor de destino, Altough IIS 7.5 también sería una opción

Respuesta

13

quiero decir que, como terminé haciéndolo.

Ambas aplicaciones acceden a una base de datos MySQL y acceden a una tabla de "sesión", que consiste en un Guid, la ID del usuario y una confirmationString (supongo que codifiqué el IDUser de alguna manera) y una fecha.

Las sesiones solo las inicia la aplicación PHP (debido a que la aplicación PHP sigue siendo la principal). Una nueva sesión dará como resultado una nueva entrada en la tabla de registro. Todos los enlaces en la aplicación PHP, que enlazan a la aplicación ASP.Net contienen GET-Parameters, que contienen el Guid, etc.

La aplicación ASP.net comprueba los parámetros GET y configura el IDUser en la sesión ASP.Net , si los GET-Parámetros apuntan a una sesión existente.

Los enlaces que apuntan a la aplicación PHP utilizan la misma técnica.

(también hay otras cosas a considerar, tales como tiempos de espera o cierres de sesión, pero que se pueden manejar también)

En general, diría que mi enfoque es útil y ninguno de los clientes se quejaron ya el despliegue (hace más de 1 año)

+0

gracias por la solución, esto es exactamente con lo que también estaba luchando. – Mana

0

http://cz.php.net/manual/en/function.session-set-save-handler.php
http://support.microsoft.com/kb/317604

Puede escribir sesiones de PHP en MsSQL, y configurar .NET para utilizar MsSQL como backend para sesiones.

+0

@ ASPosNET no es compatible con la configuración de un estado de sesión en MySQL, ya que utiliza varios procedimientos estándar y, si no me equivoco, utiliza un objeto 'SqlConnection' para conectarse a ** SQL Servidor ** back end. –

+0

¿Hay alguna razón por la que no pueda conectarse al servidor sql desde mysql a través de otro conector, y lea los mismos datos que con SqlConnection? – nothrow

2

No creo que sea nativamente posible compartir sesiones entre PHP y ASP.NET.

Sin embargo, podría ser posible utilizando una página PHP que lea los contenidos de la sesión, los almacene en campos ocultos y luego llame a una página ASP.NET que lea estos campos y los cargue en la sesión ASP.NET.

Teóricamente es posible.

0

No es un gran problema.
Su aplicación ASP debe hacer unas tres cosas sencillas:

  • Recieve una cookie sessionid desde el cliente
  • buscar el archivo sess_<id> en la sesión de PHP ruta donde se guardan
  • implementar un PHP serializar/funciones unserialize a leer/escribir datos de sesión.
-1

Oh querido, tal vez un día verá el error de sus formas, mientras tanto .....

Por defecto, PHP escribe sus datos de sesión como una matriz serializada en un archivo denominado según la sesión La sesión se identifica generalmente con una cookie con el nombre PHPSESSID.

Así que en PHP para leer manualmente la sesión:

$imported_session=unserialize(file_get_contents(session_save_path() . '/' . $_COOKIE[session_name()])); 

El formato del archivo es muy sencillo y fácil de analizar.

Sin embargo, es bastante fácil implementar su propio manejador de sesión PHP para escribir los archivos en cualquier formato/en cualquier almacenamiento que desee (eche un vistazo a autoprep para cómo asociar el código revosed con cada página sin tener que reescribir cada uno). O cambie el nombre de la cookie utilizada para almacenar la sesión.

C.

+6

¿Te importaría explicar "Oh querido, tal vez algún día verás el error de tus caminos, mientras tanto ..."? – citronas

0

Una forma más agradable que acaba de piratería informática en los mecanismos de almacenamiento de sesión en ambos lados sería estableciendo proveedor de OpenID y enchufar los consumidores OpenID para ambas aplicaciones ASP.NET y PHP.

Hay muchos códigos existentes para hacerlo. Sería más elegante y propenso a errores que las soluciones de bajo nivel. Como beneficio adicional, puede usar el inicio de sesión integrado de OpenId en el resto de las aplicaciones de su compañía y convertirse en un héroe de la compañía.

Ver: Using OpenID for both .NET/Windows and PHP/Linux/Apache web sites

2

Esta es una pregunta antigua, pero no creo que ninguna de las respuestas actuales haya sido completa.

En primer lugar, creo que es una mala idea almacenar datos de sesión en un servidor de base de datos como mysql o SQL Server. La base de datos es un recurso precioso, y realmente no hay razón para cambiarlo solo por los datos de la sesión.

Si va a almacenar la sesión en una base de datos como esa, hay "mejores" formas de hacerlo, como asegurarse de que los datos de la sesión estén en su propio disco independiente, etc. ... pero, sinceramente, todavía siente que es un error y limitará su escalabilidad.

Para almacenar la sesión, quiere ir con un simple almacén de claves/valores, y en mi opinión no se puede vencer a memcached (aunque también he tenido suerte con redis + nodejs).

memcached tiene clientes disponibles para casi todos los idiomas en la tierra: http://code.google.com/p/memcached/wiki/Clients

Así que, básicamente, todo lo que tiene que hacer cuando se utiliza memcached es generar un token pseudo-aleatorio de la clave, y hacer un memcached.set. Luego, almacene esa clave en una cookie llamada session-id o algo así.

La cookie session-id se puede leer desde cualquier idioma de servidor, .net, php, python, lo que sea, y el valor de la sesión recuperado con un simple memcached.get.

Mira la documentación memcached: http://code.google.com/p/memcached/wiki/NewStart

Esta es una manera muy simple y escalable para hacer sesiones, y trabajará con casi cualquier lenguaje/servidor.

+0

En lugar de usar Memcache, ¿podría usar Microsoft Velocity para la comunicación entre PHP y ASP.NET? ¿Funcionará Microsoft Velocity con PHP? En caso afirmativo, ¿qué tan bien funciona Microsoft Velocity con PHP? – user1338998

Cuestiones relacionadas