2009-07-19 28 views
42

Estoy usando aspx y C# para configurar una cookie de autenticación para un inicio de sesión.Almacenamiento de más información usando FormsAuthentication.SetAuthCookie

FormsAuthentication.SetAuthCookie(UserName, True) 

Quiero almacenar más información en la misma cookie. ¿Puedo agregar valores a esta cookie de autenticación o debo usar una segunda cookie http?

Básicamente estoy buscando distancia para almacenar de Id el usuario por lo que puede ser capaz de acceder a la base de datos utilizando la Tabla de usuarios fila de teclas

Gracias, Eden

Respuesta

47

Puede añadir datos de usuario a la FormsAuthenticationTicket, a continuación, generar la cookie de sí mismo.

Hay un ejemplo en el the MSDN documentation for FormsAuthenticationTicket.

EDITAR

Tenga en cuenta que al crear el billete, es necesario establecer el tiempo de espera, que, en general, que tendrá que ser el mismo que el valor configurado en web.config. Desafortunadamente, en Framework 3.5 o anterior, la clase FormsAuthentication no expone este tiempo de espera públicamente. Para una solución alternativa, use una de las técnicas descritas en la respuesta al this connect feedback item.

ACTUALIZACIÓN

que conectan elemento de retroalimentación ya no está allí, por desgracia. Ojalá hubieras descrito brevemente cuáles eran las técnicas.

Sí, es una pena que Microsoft haya descartado elementos históricos de Connect. IIRC, las dos técnicas que nos recomendaron eran:

  1. Uso WebConfigurationManager de leer la sección de configuración correspondiente y obtener el valor de tiempo de espera.

  2. Crea una cookie con FormsAuthentication.GetAuthCookie, descifrálala usando FormsAuthentication.Decrypt e inspecciona la FormsAuthenticationTicket generada.

O actualice a .NET 4.x donde hay una propiedad FormsAuthentication.Timeout.

Ver this question para obtener más información

+0

¡Gracias! esto es exactamente lo que estaba buscando! Parece que se superpone el comportamiento de FormsAuthentication.SetAuthCookie es asp.net 3.5 (no tengo tiempo para usar el reflector) con solo una pequeña diferencia. que puede adjuntar datos arbitrarios a la cookie (no solo el nombre). ¡Gracias de nuevo! – Eden

+0

Ese elemento de retroalimentación Connect ya no está allí, por desgracia. Desearía haber descrito brevemente cuáles fueron las técnicas ... –

+1

En .NET 4.x, la forma de usar FormsAuthentication.Timeout al crear un nuevo ticket es así: DateTime.Now.Add (FormsAuthentication.Timeout) –

1

Pass ese ID de usuario como nombre de usuario param.

FormsAuthentication.SetAuthCookie(userId, True) 

¿Cómo estás del acceso a sus entradas de autenticación?

+5

No quiero pasarlo _en lugar_ del nombre. Me gustaría agregar más datos a la misma cookie de autenticación. ¿Es eso posible? – Eden

+1

@Eden resolvió su problema. Estoy usando el mismo enfoque, pero no sé cómo almacenar el ID de usuario y las funciones en el mismo ticket. – rogue39nin

15

Puede poner lo que desee en la cookie de autenticación, siempre que le sea útil. Dicho esto, si está poniendo información confidencial, debería cifrarla, como mínimo, pero recomendaría no incluir información confidencial allí. Puede hacer algo como:

Forms.SetAuthCookie (UserName + "|" + UserId, true); 

Luego, siempre que necesite el nombre de usuario o la identificación de usuario, está allí. Simplemente cargue la cookie y analice los valores que necesita.

Una vez más, Aconsejo no hacerlo, especialmente porque lo tengo presentado anteriormente. Dicho esto, es posible. Debe crear métodos de acceso para extraer los datos de vuelta:

public int CurrentUserId 
{ 
    get 
    { 
     int userId = 0; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]); 
     } 

     return userId; 
    } 
} 

public string CurrentUserName 
{ 
    get 
    { 
     string userName = string.Empty; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userName = HttpContext.Current.User.Identity.Name.Split('|')[0]; 
     } 

     return userName; 
    } 
} 
+0

Debo señalar que la manera que he presentado aquí es la forma "conveniente" y funcionará, pero si tuviera que hacerlo para tener un impacto menor en el sistema en general, usaría el enfoque que Joe ha presentado. – andymeadows

3

Si es inteligente para usar "|" para poner más información. Si Microsoft tiene otro método sobrecargado

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)` 

Entonces nuestra vida será mucho más fácil, nuestro código será más seguro.

-1

Puede establecer el tiempo de espera en función del valor en web.config utilizando FormsAuthentication.Timeout.TotalMinutes.

+0

Revisemos el pregunta: "Básicamente, estoy buscando guardar el ID del usuario para poder acceder a la base de datos usando la clave de fila de la tabla de usuarios". Esto ni remotamente lo contesta – nathanchere

+0

Tiene razón, debería ser un comentario sobre la respuesta principal (http://stackoverflow.com/a/1150271/1758188). Específicamente, es una forma de cumplir lo siguiente: "... necesita establecer el tiempo de espera, que en general querrá ser el mismo que el configurado en web.config". –

+0

@nathanchere toma un hombre frío de la píldora. La información que dio fue una parte crítica de la solución general. Esta es una de las debilidades del modelo SO, es que no reconoce la importancia de la discusión auxiliar (definición: proporcionar ayuda y apoyo suplementarios o adicionales). Esto no debe restringirse al escaso sistema de comentarios, que no tiene formato de código, etc. –

Cuestiones relacionadas