2011-07-07 18 views
12

Si bien esto es posible en C#: (Usuario es una clase L2S en este caso)¿Cómo almacenar un objeto en una cookie?

User user = // function to get user 
Session["User"] = user; 

por qué no es posible?

User user = // function to get user 
HttpCookie cookie = new HttpCookie(); 
cookie.Value = user; 

y cómo se puede hacer? No quiero almacenar la identificación del usuario dentro de la cookie y luego realizar una validación.

Por cierto, ¿es seguro almacenar un objeto dentro de una cookie en lugar de solo la ID?

Respuesta

10

Una cookie es solo datos de cadena; la única forma de hacerlo sería serializarlo como una cadena (xml, json, base-64 de binario arbitrario, lo que sea), sin embargo, no debería realmente confiar en cualquier cosa en una cookie si se relaciona con información de seguridad ("¿quién soy yo?") como: es fácil para el usuario final cambiarlo, yb: no quiere que la sobrecarga de nada sea grande en cada solicitud.

IMO, almacenando en caché esto como el servidor es lo correcto; no pongas esto en una cookie.

+0

por lo debo usar para una caché básica me recuerdan opción? – Shaokan

+1

@Shaokan absolutamente; eso podría ser "sesión", o un caché más básico. Pero no necesita ir al cliente. Todas las necesidades del cliente son algunos tokens aleatorios. –

+0

básicamente si cada usuario tiene un guid que se crea en el registro, y si guardo ese guid en cookies para recordar al usuario, ¿sería un método seguro? – Shaokan

4

La respuesta corta es: Las cookies almacenan cadenas y no objetos binarios.

Puede serializar su objeto en cadenas o JSON si realmente quisiera. Sugiera mantener los datos atrás/adelante tan livianos como sea posible. Recuerde: cada vez que nos comunicamos desde el navegador al servidor, usted está pasando todos esos datos cada vez.

0

Pruebe algo como esto?

StringWriter outStream = new StringWriter(); 
XmlSerializer s = new XmlSerializer(typeof(List<List<string>>)); 
s.Serialize(outStream, myObj); 
cookie.Value = outStream.ToString(); 
1

puede encriptar dicha cookie también. El contenido (json/xml/etc) sería un poco más seguro entonces. El almacenamiento en caché del lado del servidor como sugiere Marc es probablemente mejor.

Tradeoff: aumento del tráfico en el cable (las cookies se transfieren hacia adelante y hacia atrás) Vs mayor huella de memoria del lado del servidor y/o almacenamiento secundario.

btw: no olvide que el código binario puede codificarse en texto si realmente lo necesita.

http://www.codeproject.com/KB/security/TextCoDec.aspx

0

en Cookies Puede almacenar un valor de tipo cadena. puede almacenar su objeto en sesión, viewstate o en caché. pero aún desea almacenar en cookies, solo use la clase system.web.script.javascriptserialization y convierta todo el objeto en cadena json y luego almacénelo en su cookie.

9

Puede utilizar JSON

string myObjectJson = new JavaScriptSerializer().Serialize(myObject); 
var cookie = new HttpCookie("myObjectKey", myObjectJson) 
{  
    Expires = DateTime.Now.AddYears(1) 
}; 
HttpContext.Response.Cookies.Add(cookie); 
+1

es la mejor opción. Yo uso Newtonsoft.Json. Recuerda cuando recuperas el uso: var s = HttpContext.Current.Server.UrlDecode (cookie.Values ​​["myObjectKey"]. ToString()); – harveyt

+0

Sí, utilice Netwonsoft.Json. Solo quería hacer una respuesta simple con la biblioteca estándar. –

0
System.Collections.Specialized.NameValueCollection cookiecoll = new System.Collections.Specialized.NameValueCollection(); 

      cookiecoll.Add(bizID.ToString(), rate.ToString()); 


     HttpCookie cookielist = new HttpCookie("MyListOfCookies"); 
     cookielist.Values.Add(cookiecoll); 
     HttpContext.Current.Response.Cookies.Add(cookielist); 
0

puede probar esto:

public void AddToCookie(SessionUser sessionUser) 
    { 
     var httpCookie = HttpContext.Current.Response.Cookies["SessionUser"]; 
     if (httpCookie != null) 
     { 
      httpCookie["ID"] = sessionUser.ID.ToString(); 
      httpCookie["Name"] = sessionUser.Name; 
      httpCookie["Email"] = sessionUser.Email; 
      httpCookie["Phone"] = sessionUser.Phone; 
      httpCookie.Expires = DateTime.Now.AddDays(1); 
     } 

    } 
0

para almacenar un objeto en una cookie que tenemos que convertirlo en la presentación Stringified (comprimido o no) que está limitado a 4kb. este ejemplo demuestra cómo mantener un pequeño objeto "Comprar" en las cookies (guardar/prolongar/restablecer/borrar). en lugar de líneas de código separadas, he usado un Json para llenar este objeto con algunos datos.

using System; 
using System.Collections.Generic; 
using System.Web; 
using Newtonsoft.Json; 
public class Customer 
{ 
    public int id; 
    public string name; 
} 
public class Order 
{ 
    public int id; 
    public decimal total; 
    public Customer customer; 
} 
public class OrderItem 
{ 
    public int id; 
    public string name; 
    public decimal price; 
} 
public class Buy 
{ 
    public Order order; 
    public List<OrderItem> cart; 
} 
static readonly string cookieName = @"buy"; 
protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    if (!IsPostBack) 
     Restore_Click(null, null); 
} 
protected void Save_Click(object sender, EventArgs e) 
{ 
    string buy = JsonConvert.SerializeObject(new 
    { 
     order = new 
     { 
      id = 1, 
      total = 20.10, 
      customer = new 
      { 
       id = 1, 
       name = "Stackoverflow" 
      } 
     }, 
     cart = new[] { 
      new { 
       id = 1 , 
       name = "Stack", 
       price = 10.05 
      }, 
      new { 
       id = 2 , 
       name = "Overflow", 
       price = 10.05 
      } 
     } 
    }); 
    HttpContext.Current.Response.Cookies.Add(
     new HttpCookie(cookieName, buy) { 
      Expires = DateTime.Now.AddDays(7) 
     } 
    ); 
    StatusLabel.Text = "Saved"; 
} 
protected void Prolong_Click(object sender, EventArgs e) 
{ 
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName]; 
    if (cookie != null) 
    { 
     cookie.Expires = DateTime.Now.AddDays(7); 
     HttpContext.Current.Response.Cookies.Add(cookie); 
     StatusLabel.Text = "Prolonged"; 
    } 
    else StatusLabel.Text = "Not prolonged - expired"; 
} 
protected void Restore_Click(object sender, EventArgs e) 
{ 
    Buy buy = null; 
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName]; 
    if (cookie != null) 
    { 
     buy = JsonConvert.DeserializeObject<Buy>(cookie.Value); 
     StatusLabel.Text = "Restored"; 
    } 
    else StatusLabel.Text = "Not restored - expired"; 
} 
protected void ClearOut_Click(object sender, EventArgs e) 
{ 
    HttpCookie cookie = HttpContext.Current.Request.Cookies[cookieName]; 
    if (cookie != null) 
    { 
     cookie.Expires = DateTime.Now.AddMonths(-1); 
     HttpContext.Current.Response.Cookies.Add(cookie); 
     StatusLabel.Text = "Cleared out"; 
    } 
    else StatusLabel.Text = "Not found - expired"; 
} 
+0

Agregar pequeñas explicaciones a la respuesta principal (tarde) será más útil que solo copiar/pasar un fragmento de código. –

+0

si no sabes leer el código C#, no significa que debas rechazar, querida Maher Abuthraaaaaaaa –

+0

Gracias por actualizar tu respuesta. No te devolví el voto. tu código es relativamente largo y no está documentado ... No sé si responderá a la pregunta o no ... Además, el código solo para mí se considera respuesta de baja calidad :-) –

0

Cookie store only strings. Lo que puede hacer:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
var json = serializer.Serialize(user); 
controller.Response.SetCookie(
     new HttpCookie({string_name}, json) 
     { 
      Expires = false // use this when you want to delete 
        ? DateTime.Now.AddMonths(-1) 
        : DateTime.Now.Add({expiration}) 
     }); 

Esto debe insertar el objeto entero a la galleta.

Para leer de la cookie de nuevo a un objeto:

public static {Object_Name} GetUser(this Controller controller) 
    { 

     var httpRequest = controller.Request; 

     if (httpRequest.Cookies[{cookie_name}] == null) 
     { 
      return null; 
     } 
     else 
     { 
      var json = httpRequest.Cookies[{cookie_name}].Value; 
      var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
      var result = serializer.Deserialize<{object_name}>(json); 
      return result; 
     } 

    } 
Cuestiones relacionadas