2010-10-18 10 views
13

Necesito un reciclaje de grupo de aplicaciones para ser completamente transparente para los usuarios de mi aplicación web.MVC: los usuarios deben volver a autenticarse en IIS Recycle

Actualmente, en un reciclado del grupo de aplicaciones de IIS 7, todos los usuarios que inician sesión en mi aplicación web son expulsados ​​y deben volver a iniciar sesión (Context.User.Identity.IsAuthenticated se establece en falso). Empleo SQL State Server, utilizo autenticación de formularios y ambos están configurados para usar cookies. Tenía la impresión de que .NET y/o IIS manejan la autenticación de las cookies.

Sin embargo, cada vez que se recicla el grupo de aplicaciones Context.User.Identity.IsAuthenticated se establece en false (y no tengo ni idea de dónde ocurre esto) mis usuarios son expulsados ​​y deben volver a iniciar sesión. Puedo veo que la identificación de la sesión permanece igual a través de los inicios de sesión, también puedo ver esta información de la sesión en la base de datos/servidor de estado.

No sé si es una sesión o un problema con las cookies.

Por favor ayuda!

método

inicio de sesión:

public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) 
    { 
     if (!ValidateLogOn(userName, password)) 
     { 
      return View(); 
     } 

     FormsAuth.SignIn(userName, true); // uses FormsAuthentication.SetAuthCookie(username, true); 
     Session["userName"] = userName; 

     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 

controlador personalizado Atributo:

public class CookieAuthorizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpContext lvContext = HttpContext.Current; 

      if (!lvContext.User.Identity.IsAuthenticated) 
      { 
       lvContext.Response.Redirect("~/Account/Logon"); 
      } 
      else 
      { 
       FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; 
       FormsAuthentication.RenewTicketIfOld(identity.Ticket); 
      } 

     base.OnActionExecuting(filterContext); 
    } 
} 

WebConfig:

<authentication mode="Forms"> 
    <forms cookieless="UseCookies" loginUrl="~/Account/LogOn" slidingExpiration="true" name=".ASPXAUTH" requireSSL="false" timeout="2880" /> 
</authentication> 

<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="ScriptModule" /> 
    <remove name="UrlRoutingModule" /> 
    <remove name="Session" /> 
    <remove name="FormsAuthentication" /> 
    <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <add name="NHibernateMvcSessionModule" type="EpnNHibernateBase.NHibernateMvcSessionModule, EpnNHibernateBase" /> 
    <add name="Session" type="System.Web.SessionState.SessionStateModule" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
</modules> 
+2

Creo que esto podría no estar claro a partir de su pregunta, pero ¿está ejecutando el StateServer en la misma máquina/VM que el servidor web? Porque si lo está, creo que StateServer confía en IIS, por lo que eliminar AppPool también reducirá StateServer. –

+0

Sí, estoy ejecutando esto localmente (en el mismo servidor que el Pool de aplicaciones/IIS). – alan

+1

Acabo de encontrarme con esta publicación y pensé que haría una ligera corrección al comentario anterior. StateServer es un servicio separado de Windows por lo que continuará ejecutándose sin perder los datos de estado, incluso si IIS se reinicia por completo. –

Respuesta

16

Pude encontrar una solución por mi cuenta. El problema no fue cómo la autenticación se manejó mediante programación o cómo estaba autenticando usuarios. El problema estaba en cómo había configurado la autenticación en IIS/web.config.

que siguieron atentamente los pasos de los enlaces que aparecen a continuación:

Configuring Forms Authentication (IIS 7) (ramificación hacia fuera en todos los sectores relacionados)

Configuring Machine Keys in IIS 7 < - Este en particular

Después de haber seguido los pasos de cerca Pude generar correctamente una clave de máquina. Esta clave máquina es como sigue (con una clave fabricado):

<machineKey decryptionKey="ASDF3WS545AS5D4F8254A12DAFA5SDF7,IsolateApps" validation="3DES" validationKey="A65A6S5DF46ASD4F89WEF6SAD2F4A68EF4AW65F4D3A2F4AS6DF89A98D4F6A5SD4F6A5SDF46ASD8F4A6S5DF46AS5D4F6AS5DF49AS8DF46AS5D4F6AS5DF46SAD5F,IsolateApps" /> 

Además, httpModulesysystem.webServer:modules secciones en el web.config requieren la adición de los siguientes módulos:

<remove name="Session" /> 
<remove name="FormsAuthentication" /> 
<add name="Session" type="System.Web.SessionState.SessionStateModule" /> 
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 

Resumen: De lo que deduzco, las cookies se crearon y encriptaron, pero como no había una clave de máquina, no pude descifrar la cookie, lo que provocó la necesidad de volver a autenticar.

+0

Muchas gracias. Justo lo que necesitaba. Aunque no necesité agregar la configuración del módulo que mencionaste, solo las teclas de la máquina. –

+7

Si no especifica una clave de máquina, se genera automáticamente una clave aleatoria específica para el grupo de aplicaciones cuando se inicia el grupo. Cuando se recicla el grupo, la clave se regenera, lo que hace que todas las cookies existentes no sean válidas. –

2

has necesitado almacenar las sesiones en una base de datos por lo que son persistentes, incluso si el proceso es reciclado? see here for howto

+0

Sí, inicialmente intenté SQL en lugar de un Servicio de estado local. Recibo los mismos resultados Decidí seguir con el Servicio de estado ASP.NET hasta que consiga que estas sesiones persistan. Parece que la sesión se está obteniendo a través del servicio pero, tras el reciclaje de AppPool, se requiere que todos los usuarios vuelvan a iniciar sesión. – alan

+0

@Alan, SQL Server ** ** persistirá en las sesiones durante el reciclaje del grupo de aplicaciones. –

+0

@Dan entiendo eso. El problema es que no puedo hacer que funcione. Por lo tanto, he elegido quedarme con un servicio estatal ASP.NET local (que también persistirá a través de un reciclaje) ya que es el enfoque más básico. Si alguien amablemente me puede ayudar a solucionar mi configuración actual, lo agradecería enormemente. – alan

2

Al leer su publicación de cerca, parece que el problema real es que los usuarios no vuelven a conectarse automáticamente. Esto es manejado por las cookies asumiendo que está utilizando autenticación de formularios.

Una vez que un usuario ha iniciado sesión, su estado de sesión se restaurará si está utilizando SQL para conservarlo.

Para depurar las cookies, puede utilizar Fiddler u otros sniffers de cookies.

Publicar su web.config sería útil también.

+0

He vuelto a SQL para manejar mis sesiones. La ID de sesión persiste. Supongo que estaba confundiendo la necesidad de volver a iniciar sesión después de un reciclaje para que sea necesario volver a autenticarlo. Mi problema ahora es que el usuario debe volver a iniciar sesión después del reciclaje. ¿Algunas ideas? – alan

+1

Parece un problema de cookies. La cookie es la forma en que el usuario vuelve a entrar. Publique su archivo web.config con la sección de autenticación de formularios. – rboarman

+0

@rboarman He publicado el estado de la sesión y formulo secciones de autenticación de mi configuración. Por favor, avíseme si hay otras secciones que le gustaría ver. – alan

Cuestiones relacionadas