2011-02-08 12 views
37

Por lo tanto, hay muchas publicaciones en StackOverflow con respecto a esto, pero no pude resolver mi problema exacto. Aquí está la esencia:Confusión de cookies con FormsAuthentication.SetAuthCookie() Método

Tengo un sitio web que requiere autenticación. Estoy usando el método .NET FormsAuthentication.SetAuthCookie() para persistir en la sesión del usuario.

Mi pregunta es esta: en el archivo web.config, hay un atributo de tiempo de espera para el nodo "/system.web/authentication/forms". Si configuro este valor para decir, 30 minutos, ¿es este el tiempo de inactividad del usuario que el usuario puede tener antes de que su sesión expire?

La razón por la que pregunto es que no importa en qué establezca este valor, si establezco la persistencia en verdadero en SetAuthCookie(), la caducidad en el conjunto de cookies es de 90 minutos. Si establezco la persistencia en falso en SetAuthCookie(), la caducidad de la cookie se establece en "fin de la sesión".

¿Qué es realmente el valor del atributo "Timeout" y cómo puedo obtener una cookie persistente que dura un mes o un año o más?

Respuesta

44

El tiempo de espera de parámetros que ha encontrado en /system.web/authentication/forms es el tiempo de espera (en minutos) de la duración del ticket de autenticación.

Esto significa que después de un cierto período de inactividad, se solicita al usuario que inicie sesión de nuevo. Si intentas marcar My.Profile.Current.IsAuthenticated, será false.

Puede optar por no conservar la cookie. En esta situación, si su boleto expira, su cookie caduca también. La cookie (en caso de que persista) tiene el propósito de recordar al usuario si vuelve a su sitio.

Es posible que desee conservar su cookie durante 10 años para que el usuario nunca tenga que volver a insertar el nombre de usuario y la contraseña, a menos que haya elegido eliminar la cookie. La cookie es válida incluso si el navegador está cerrado (cuando se conserva).

Otra cosa importante a recordar es la slidingExpiration parámetro:

<authentication mode="Forms"> 
    <forms loginUrl="~/Partner/LogOn" defaultUrl="~/Home/Index" 
      timeout="30" slidingExpiration="true" /> 
</authentication> 

si es verdad que su vale de autenticación se renueva cada vez que hay actividad en su sitio: actualización de la página, etc.

Lo que puede hacer - y lo que he hecho - es escribir su propia cookie de la siguiente manera:

FormsAuthenticationTicket authTicket = new 
    FormsAuthenticationTicket(1, //version 
    userName, // user name 
    DateTime.Now,    //creation 
    DateTime.Now.AddMinutes(30), //Expiration (you can set it to 1 month 
    true, //Persistent 
    userData); // additional informations 

actualización

He aplicado esta causa rutina Quiero guardar mis grupos en una cookie cifrada:

Dim authTicket As System.Web.Security.FormsAuthenticationTicket = _ 
     New System.Web.Security.FormsAuthenticationTicket(_ 
      1, _ 
      UserName, _ 
      Now, _ 
      Now.AddYears(100), _ 
      createPersistentCookie, _ 
      UserData) 

Dim encryptedTicket As String = System.Web.Security.FormsAuthentication.Encrypt(authTicket) 

Dim authCookie As HttpCookie = New HttpCookie(_ 
    System.Web.Security.FormsAuthentication.FormsCookieName, _ 
    encryptedTicket) 

If (createPersistentCookie) Then 
    authCookie.Expires = authTicket.Expiration 
End If 

Response.Cookies.Add(authCookie) 

Como se puede ver que he puesto a la expiración de la cookie de autenticación y el vale de autenticación con el mismo tiempo de espera (solo cuando persiste).

Otra cosa que he intentado es almacenar el nombre de usuario y la contraseña en la cookie cifrada. Cada vez que se carga una página maestra, compruebo My.Profile.Current.IsAuthenticated para ver si la autenticación sigue siendo válida.Si no leí la cookie de nuevo, obtener el nombre de usuario y contraseña, y comprobar que en el DB:

Public Function ReadCookieAuthentication(ByVal Context As System.Web.HttpContext) As Security.CookieAuth 

    Dim CookieUserData = New Security.CookieAuth() 

    Dim cookieName As String = System.Web.Security.FormsAuthentication.FormsCookieName 
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName) 

    If (Not (authCookie Is Nothing)) Then 
     Dim authTicket As System.Web.Security.FormsAuthenticationTicket = Nothing 
     Try 
      authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value) 
      If (Not (authTicket Is Nothing)) Then 
       If (authTicket.UserData IsNot Nothing) AndAlso Not String.IsNullOrEmpty(authTicket.UserData) Then 
        CookieUserData = New JavaScriptSerializer().Deserialize(Of Security.CookieAuth)(authTicket.UserData.ToString) 
       End If 
       CookieUserData.UserName = authTicket.Name 
      End If 
     Catch ex As Exception 
      ' Do nothing. 
     End Try 
    End If 

    Return (CookieUserData) 

End Function 

Security.CookieAuth es un objeto que he creado para devolver nombre de usuario y contraseña.
CookieUserData es el almacenamiento (guardo en formato json) donde pongo mi contraseña y mis grupos.

+1

Hola, lo siento, sé que esto ha sido demasiado viejo, pero solo curiosidad, ¿por qué almacenarlo en formato json? la contraseña y grupos soy muy nuevo en mvc, así que sigo intentando comprender los conceptos y las mejores prácticas para desarrollarlo. gracias! – gdubs

+3

@gdubs: Sí, lo sé. Es un poco inusual. Pude haber elegido otro formato, pero me gusta JSON. Además, con MVC tiende a usar JSON bastante, así que lo he adoptado como estándar. – LeftyX