it-swarm.com.de

Wie speichere ich ein Objekt in einem Cookie?

Dies ist in C # zwar möglich: (Benutzer ist in dieser Instanz eine L2S-Klasse)

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

warum ist das nicht möglich?

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

und wie geht das? Ich möchte die ID des Benutzers nicht im Cookie speichern und dann eine Überprüfung durchführen.

Ist es übrigens sicher, ein Objekt in einem Cookie zu speichern und nicht nur die ID?

14
Shaokan

Ein Cookie besteht nur aus Zeichenfolgendaten. Der einzige Weg, dies zu tun, wäre, es als String zu serialisieren (xml, json, base-64 von beliebigen Binärdateien, was auch immer). Allerdings sollten Sie einem Cookie nicht wirklich vertrauen, wenn es sich um Sicherheit handelt Informationen ("Wer bin ich?") als: Es ist für den Endbenutzer einfach, sie zu ändern, und b: Sie möchten nicht, dass bei jeder einzelnen Anfrage der Aufwand für irgendetwas Großes entsteht.

IMO ist es richtig, dies als Server zwischenzuspeichern. Steck das nicht in einen Keks.

11
Marc Gravell

Sie können JSON verwenden

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

Die kurze Antwort lautet: Cookies speichern Zeichenfolgen und keine binären Objekte.

Sie könnten Ihr Objekt in Strings oder JSON serialisieren, wenn Sie es wirklich wollten. Schlagen Sie vor, die Daten so gering wie möglich zu halten. Denken Sie daran: Jedes Mal, wenn wir vom Browser zum Server kommunizieren, übergeben Sie all diese Daten.

4
p.campbell

sie können ein solches Cookie auch verschlüsseln. Der Inhalt (json/xml/etc) wäre dann etwas sicherer. Server-seitiges Caching, wie Marc vorschlägt, ist wahrscheinlich besser.

Kompromisse: erhöhter Datenverkehr auf der Leitung (Cookies werden hin und her weitergeleitet) Vs größerer serverseitiger Speicherbedarf und/oder Sekundärspeicher.

Übrigens: Vergessen Sie nicht, dass Binärdateien in Text codiert werden können, wenn Sie das wirklich brauchen.

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

1
sgtz

Versuchen Sie so etwas?

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

sie können dies versuchen:

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
Cute Teddy

im Cookie können Sie einen Wert vom Typ String speichern. Sie können Ihr Objekt in einer Sitzung, einem Ansichtszustand oder im Cache speichern. Möchten Sie trotzdem in Cookies speichern, verwenden Sie einfach die Klasse system.web.script.javascriptserialization, konvertieren Sie das gesamte Objekt in json-Zeichenfolge und speichern Sie es in Ihrem Cookie.

0
Sonu
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
Ankita Singh

um ein Objekt in einem Cookie zu speichern, müssen Sie es in eine komprimierte oder komprimierte Darstellung konvertieren, die auf 4 KB beschränkt ist. Dieses Beispiel zeigt, wie Sie ein kleines "Buy" -Objekt in Cookies speichern (Speichern/Erweitern/Zurücksetzen/Löschen). anstelle von separaten Codezeilen habe ich einen Json verwendet, um dieses Objekt mit einigen Daten zu füllen.

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

Cookie nur Zeichenfolgen speichern. Was du tun kannst:

 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})
        });

Dies sollte das gesamte Objekt in das Cookie einfügen.

Um vom Cookie zurück zu einem Objekt zu lesen:

    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;
        }

    }
0
Igal C