2011-03-01 17 views
8

Tenemos una pequeña aplicación que creamos en nuestro tiempo libre usando las últimas bibliotecas .net de mvc3 y Entity Framework disponibles en ese momento, y desplegándola. A la gerencia le gustó, y lo quieren integrado en una pesada aplicación de formularios web .net 3.5.¿Cómo puedo compartir sesiones autenticadas basadas en .NET (C#) entre formularios web y aplicaciones MVC2?

Necesito de alguna manera usar las mismas sesiones de autenticación en las dos aplicaciones. Estoy usando la misma base de datos y la misma aplicación para la autenticación utilizando la membresía de .net y los proveedores de perfiles. Esto funciona bien, pero los usuarios deben iniciar sesión por separado en la aplicación MVC incluso cuando ya hayan iniciado sesión en la aplicación principal. Estoy abierto a cualquier sugerencia: enabling state session at a different level, o shared cookies, etc.

¿Cuál es la mejor manera de eludir este requisito de inicio de sesión y si debería integrar la aplicación mvc en los formularios web o mantenerla como una aplicación independiente? Mis preocupaciones principales que afectan la decisión serían el tiempo necesario para la integración completa y el posterior mantenimiento de las aplicaciones.

Respuesta

7

En primer lugar, el hecho de una aplicación ASP.NET MVC se hace ninguna diferencia aquí :)

En segundo lugar, aquí es un ejemplo de qué hacer a partir de MSDN:

http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

pequeño fragmento desde esa página:

<configuration> 
    <system.web> 
    <authentication mode="Forms" > 
     <!-- The name, protection, and path attributes must match 
      exactly in each Web.config file. --> 
     <forms loginUrl="login.aspx" 
     name=".ASPXFORMSAUTH" 
     protection="All" 
     path="/" 
     domain="contoso.com" 
     timeout="30" /> 
    </authentication> 

    <!-- Validation and decryption keys must exactly match and cannot 
     be set to "AutoGenerate". The validation and decryption 
     algorithms must also be the same. --> 
    <machineKey 
     validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
     decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
     validation="SHA1" /> 
    </system.web> 
</configuration> 

.

P.S.

Asesoramiento de StriplingWarrior sobre la combinación de ambas aplicaciones aunque no sea realmente necesario, pero puede ser muy útil para futuras integraciones. Más tarde puede terminar haciéndolo de todos modos.

+2

+1 para mencionar también las teclas de máquina: incluso si están en la misma máquina, si las agrupaciones de aplicaciones son diferentes, habrá problemas si no se establecen. Su atributo de dominio debería leer '.contoso.com' - no se le permitirá establecer cookies con un solo período. –

0

Es posible que desee considerar la simple integración de esta aplicación en su aplicación Web Forms directamente. Los dos pueden coexistir en la misma aplicación.

2

La autenticación de formularios utiliza cookies para rastrear usuarios. Las cookies solo se pueden compartir entre el mismo dominio. Entonces, por ejemplo, si tenía app1.foo.com y app2.foo.com simplemente configure esas dos aplicaciones para compartir la misma cookie de dominio. Por ejemplo, tanto web.config debe compartir la misma configuración de la autenticación de formularios:

<authentication mode="Forms"> 
    <forms 
     loginUrl="~/Account/LogOn" 
     timeout="2880" 
     domain="foo.com" 
    /> 
</authentication> 

También debe asegurarse de que ambos comparten la misma aplicación machine keys debido a una cookie de autenticación emitida por app1 necesidades a ser descifrado por app2 con las mismas teclas.

+0

Su atributo de dominio debería leer '.foo.com' - no se le permitirá establecer cookies con un solo período. –

+0

@ Zaf - Ben Duguid, no es necesario, esto funcionará. –

0

Almacenar el estado de la sesión en una base de datos. Almacene la clave de sesión en las cookies de cada sesión. En el evento AcquireSessionState en el ciclo de vida de ambas aplicaciones, obtenga la identificación de la sesión de la cookie, cargue los datos de la sesión de la base de datos y actualice su HttpContext.User. Luego tendrá los mismos datos de autenticación en ambas aplicaciones.

+0

Puede establecer el modo 'sessionState' en' SqlServer' o 'StateServer' y el marco de trabajo se encargará de todo esto por usted (serializar la sesión a una base de datos, almacenar la clave de sesión en una cookie, etc.): http : //msdn.microsoft.com/en-us/library/ms178586.aspx –

+0

Esto no suena preciso. Si recuerdo correctamente, la sesión se almacenará en asociación con una ID de aplicación. Como está ejecutando dos aplicaciones por separado, esto no resolvería los mismos datos. – smartcaveman

Cuestiones relacionadas