2011-01-02 36 views
7

Tengo un sitio Asp Mvc 2 usando autenticación de formularios. Cuando lo ejecuto localmente, puedo iniciar sesión y permanecer conectado indefinidamente.¿Por qué podrían estar cerrando sesión mis usuarios después de un minuto más o menos?

Sin embargo, cuando lo pongo en el servidor parece que solo permanezco conectado durante unos minutos y luego parece que se ha cerrado la sesión. He mirado las cookies y hay 2 que parecen relevantes:

.ASPXAUTH que es una cookie de sesión .ASPXANONYMOUS que vence en 3 meses.

Cuando actualizo la página, las cookies permanecen iguales hasta que me desconecto, cuando parece que obtengo una nueva cookie .ASPXANONYMOUS, pero el .ASPXAUTH parece ser el mismo.

Parece que podría permanecer conectado hasta que haga algo después de un cierto período de tiempo. Si envío un formulario tan pronto como estoy conectado, funciona bien, pero si continúo enviando datos una y otra vez, luego de un minuto más o menos, uno de los envíos ocurrirá como un usuario desconectado y no como el usuario que se inició sesión, que todos los demás envíos funcionó como.

¿Qué podría causar este comportamiento y cómo puedo rastrear lo que es diferente & cambiarlo para que pueda permanecer conectado indefinidamente?

EDITAR,

su un único servidor, pero después de un poco más de investigación y búsqueda del candidato probable parece ser que estoy usando más de 100 MB en el servidor y el grupo de aplicaciones está llegando el reciclado. Supongo que ahora necesito saber

  • ¿Cómo puedo verificar la cantidad de memoria que estoy usando?
  • Qué consejo hay para reducir eso.
+0

¿en qué tipo de servidor estás alojado? ¿Qué proveedor de sesión estás usando? – mlibby

+0

¿tiene solo un servidor o una granja de servidores con equilibrio de carga? –

+0

@mcl, no estoy declarando explícitamente un proveedor de sesión, no creo, ¿entonces usaría el predeterminado, sea lo que sea? Lo siento, no puedo ser más específico, pero esto es algo nuevo para mí. –

Respuesta

8

¿Podría ser que la aplicación ASP.NET se está reciclando o apagándose (por ejemplo, debido al tiempo de espera inactivo, o ensamblados recién construidos/cambiados)?

Cuando se inicia una aplicación web ASP.NET, de forma predeterminada, generará claves de cifrado para ver las cookies de estado y de sesión. Esto invalidará cualquier dato originalmente servido desde una ejecución anterior de la aplicación (o desde un sistema diferente).

Para que las sesiones sobrevivan ASP.ciclos de aplicación NET (y comunidades de varios servidores), puede especificar las llaves en su web.config:

<system.web> 
    ... 
    <machineKey 
    decryption="AES" 
    validation="SHA1" 
    decryptionKey="..." 
    validationKey="..." 
    /> 

donde decryptionKey y validationKey son cadenas hexadecimales de longitud, dependiendo del algoritmo (con AES: 64 dígitos y SHA1: 128, para otros algoritmos marque MSDN).

Estas teclas deben ser criptográficamente generado, y .NET tiene los tipos de hacer esto que pueden ser utilizados de PowerShell:

$rng = New-Object "System.Security.Cryptography.RNGCryptoServiceProvider" 
$bytes = [Array]::CreateInstance([byte], 16) 
$rng.GetBytes($bytes) 
$bytes | ForEach-Object -begin { $s = "" } -process { $s = $s + ("{0:X2}" -f $_) } -end { $s} 

Para AES utilizar la longitud de matrices anterior, para SHA1 utilizar una longitud de 64.

+0

Gracias! Esto parece haber sido el truco, al menos no me he desconectado en los últimos minutos, incluso cuando las páginas tardaron un tiempo en cargarse (que es presumiblemente cuando el reciclaje estaba ocurriendo) –

+0

esto ayudará a que las claves de sesión sobrevivan , ¿derecho? Pero si coloca datos reales en la sesión, debe asegurarse de que está utilizando un proveedor de sesión con persistencia no volátil, como SQL o archivos, ¿verdad? – mlibby

+1

@mcl: Correcto. En sesión, el estado de sesión muere con el proceso. Se requiere fuera de proceso, y eso significa que SQL Server sobrevivirá a un reinicio de la máquina. Prefiero suponer que el estado de la sesión es transitorio de todos modos, cualquier cosa que necesite a más largo plazo debe estar en un repositorio permanente con Session como caché. – Richard

1

Es muy probable que el tiempo de espera de la sesión en el servidor web esté configurado en un intervalo de tiempo mucho más pequeño que el configurado en la configuración de autenticación de formulario en web.config.

El tiempo de espera de sesión predeterminado es de 20 minutos para IIS6 e IIS7.

Si usted tiene acceso a la interfaz de administración del servidor web, puede aumentar el tiempo de espera a través de la interfaz gráfica de usuario, sino que también se puede ajustar desde el archivo de configuración si su IIS7 utilizando los <sessionState> y <sessionPageState> secciones:

http://msdn.microsoft.com/en-us/library/cc725820(v=ws.10).aspx

1

Comprobar la sección de autenticación webconfig

<authentication mode="Forms"> 
    <forms name="UniqueName" loginUrl="login.aspx" path="/" > 
    </forms> 
</authentication> 

Asegúrese de que el nombre de la cookie de autenticación para cada sitio alojado es único.

0

Si ninguno de estos funciona, verifique los grupos de aplicaciones y asegúrese de que el tiempo de espera de inactividad se establezca en más de 20 minutos. Haga clic en el grupo de aplicaciones, seleccione el enlace Advanced Settings a la derecha, busque la sección Process Model y aumente allí el valor Idle Timeout.

Cuestiones relacionadas