2011-07-07 9 views
12

これはC#では可能ですが:(ユーザーは、このインスタンス内L2Sクラスです)オブジェクトをクッキーに保存する方法は?

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

これができない理由?

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

どのようにすることができますか?私は、クッキー内にユーザーのIDを格納し、いくつかの検証をしたくありません。

可能であれば、IDだけでなくクッキー内にオブジェクトを格納するのが安全ですか?

答えて

10

クッキーは文字列データです。それを行う唯一の方法は、文字列(xml、json、任意のバイナリのbase-64など)としてシリアル化することですが、は本当にがセキュリティ情報エンドユーザがそれを変更するのは簡単ですし、b:1回のリクエストごとに大きなオーバーヘッドを必要としないようにしてください。

IMO、サーバとしてこれをキャッシュすることは正しいことです。これをクッキーに入れないでください。

+0

はので、私は基本的な私の覚えているオプションのキャッシュを使用する必要がありますか? – Shaokan

+1

@Shaokan絶対に;それは「セッション」、またはより基本的なキャッシュになる可能性があります。しかし、それはクライアントに行く必要はありません。すべてのクライアントのニーズは、ランダムなトークンです。 –

+0

だから基本的に、各ユーザが登録時に作成されたguidを持っていて、そのguidをクッキーに保存してユーザを覚えていれば、それは安全な方法でしょうか? – Shaokan

4

短い答えは:クッキーはバイナリオブジェクトではなく、文字列を格納します。

本当にしたい場合は、オブジェクトを文字列またはJSONにシリアル化できます。できるだけ軽量でデータを前後に保持することを推奨します。覚えておいてください:ブラウザからサーバーに通信するたびに、毎回すべてのデータを渡しています。

0

このような体験をしてみませんか?

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

このようなクッキーも暗号化できます。内容(json/xml/etc)は少し安全です。 Marcが示唆しているように、サーバー側のキャッシュはおそらく良いでしょう。

トレードオフ:トラフィックの増加(クッキーは前後に渡されます)より大きいサーバー側のメモリフットプリントおよび/またはセカンダリストレージ。

btw:本当に必要な場合、バイナリをテキストにエンコードできることを忘れないでください。クッキーで

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

0

あなたは、文字列型の値を格納することができます。オブジェクトをセッション、ビューステート、またはキャッシュに格納することができます。それでもクッキーに保存したいのであれば、system.web.script.javascriptserializationクラスを使用して、json stringでオブジェクト全体を変換し、それをクッキーに保存してください。

9

あなたはこの試みることができるJSON

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

が最適です。私はNewtonsoft.Jsonを使用します。 retriveを使用するときは覚えておいてください:var s = HttpContext.Current.Server.UrlDecode(cookie.Values ["myObjectKey"]。ToString()); – harveyt

+0

はい、Netwonsoft.Jsonを使用してください。私は標準ライブラリで簡単な答えを出したかっただけです。 –

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

を使用することができます。私たちは文字列化プレゼンテーション(圧縮されたかどうか)に変換する必要がクッキーにオブジェクトを格納するために

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

をこれは4kbに制限されています。この例では、Cookie(save/prolong/reset/clear)に少し "Buy"オブジェクトを保持する方法を示します。別のコード行の代わりに、私はJsonを使ってこのオブジェクトにデータを埋めました。

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

メイン(後半)に答えるための説明を少し追加するだけで、コードスニペットをコピー/過去よりも役立ちます。 –

+0

もしあなたがC#コードを読むことを知らないなら、あなたがdownvoteするべきではありません、親愛なるMaher Abuthraaaaaaaa –

+0

あなたの答えを更新していただきありがとうございます。私はあなたにdownvoteしなかった。あなたはコードが比較的長く、文書化されていません..私はそれが質問に答えるかどうかわかりません..また、私のコードだけは低品質の答えと考えられています:-) –

0

クッキーストア専用の文字列。あなたは何ができるか :

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

これはクッキーにオブジェクト全体を挿入する必要があります。

バックオブジェクトへのクッキーから読み取るために:

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

    } 
関連する問題