2010-06-29 17 views
61

Ich schaffe Cookies mit folgenden Zeilen:So erstellen Sie permanente Cookies in asp.net?

HttpCookie userid = new HttpCookie("userid", objUser.id.ToString()); 
userid.Expires.AddYears(1); 
Response.Cookies.Add(userid); 

Jetzt Wie es dauerhaft zu machen?

Wenn ich die gleiche Seite nach dem Schließen des Browsers erneut aufrufen, kann ich sie nicht wiederherstellen.

Antwort

85

So können Sie das tun.

Schreiben des dauerhaften Cookies.

//create a cookie 
HttpCookie myCookie = new HttpCookie("myCookie"); 

//Add key-values in the cookie 
myCookie.Values.Add("userid", objUser.id.ToString()); 

//set cookie expiry date-time. Made it to last for next 12 hours. 
myCookie.Expires = DateTime.Now.AddHours(12); 

//Most important, write the cookie to client. 
Response.Cookies.Add(myCookie); 

die persistente Cookie lesen.

//Assuming user comes back after several hours. several < 12. 
//Read the cookie from Request. 
HttpCookie myCookie = Request.Cookies["myCookie"]; 
if (myCookie == null) 
{ 
    //No cookie found or cookie expired. 
    //Handle the situation here, Redirect the user or simply return; 
} 

//ok - cookie is found. 
//Gracefully check if the cookie has the key-value as expected. 
if (!string.IsNullOrEmpty(myCookie.Values["userid"])) 
{ 
    string userId = myCookie.Values["userid"].ToString(); 
    //Yes userId is found. Mission accomplished. 
} 
+3

Das Lesen des dauerhaften Cookie-Codes funktionierte nicht für mich. Siehe meine Antwort in diesem Post. –

+3

Ihr Code unterscheidet sich funktional nicht von dem, der in der ursprünglichen Frage gepostet wurde, außer dass Ihr Cookie in 12 Stunden abläuft und OP's in einem Jahr. – Ortund

+2

Dieser Cookie ist nicht dauerhaft, wenn der Client den Browser schließt, wird der Cookie verschwinden. Die Frage ist, wie man ein hartnäckiges Plätzchen, anstatt ein 'Sitzung' Plätzchen schreibt. – Felype

0

Sie müssen dies als letzte Zeile hinzufügen ...

HttpContext.Current.Response.Cookies.Add(userid); 

Wenn Sie den Wert des Cookies lesen benötigen, können Sie ein ähnliches Verfahren wie diese verwenden würde:

string cookieUserID= String.Empty; 

    try 
    { 
     if (HttpContext.Current.Request.Cookies["userid"] != null) 
     { 
      cookieUserID = HttpContext.Current.Request.Cookies["userid"]; 
     } 
    } 
    catch (Exception ex) 
    { 
     //handle error 
    } 

    return cookieUserID; 
22

FWIW sehr vorsichtig sein mit unverschlüsselten so etwas wie ein Benutzer-ID in einem Cookie gespeichert werden. Dadurch ist Ihre Website sehr anfällig für Cookie-Vergiftungen, bei denen Benutzer leicht einen anderen Benutzer annehmen können. Wenn Sie so etwas in Betracht ziehen, empfehle ich Ihnen, den Cookie für die Formularauthentifizierung direkt zu verwenden.

bool persist = true; 

var cookie = FormsAuthentication.GetAuthCookie(loginUser.ContactId, persist); 

cookie.Expires = DateTime.Now.AddMonths(3); 

var ticket = FormsAuthentication.Decrypt(cookie.Value); 

var userData = "store any string values you want inside the ticket 
       extra than user id that will be encrypted" 

var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, 
    ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userData); 

cookie.Value = FormsAuthentication.Encrypt(newTicket); 

Response.Cookies.Add(cookie); 

Dann können Sie diese jederzeit von einer ASP.NET-Seite lesen von

string userId = null; 
if (this.Context.User.Identity.IsAuthenticated) 
{ 
    userId = this.Context.User.Identity.Name; 
} 
+1

Hat er FormsAuthentication Cookie gesagt? Und warum sollte man 'var' verwenden, wenn man den Typ kennt? –

+0

Danke für Sicherheitsbedenken, aber ich verwende Verschlüsselung für die Cookies! – Vikas

+14

Da redundante Angabe von Variablen redundant ist. Und da in der Frage userid als Wert angezeigt wird, der im Cookie gespeichert werden soll, ist der FormsAuth-Cookie die korrekteste Lösung für diesen IMO. –

0

// hinzufügen Cookie

var panelIdCookie = new HttpCookie("panelIdCookie"); 
panelIdCookie.Values.Add("panelId", panelId.ToString(CultureInfo.InvariantCulture)); 
panelIdCookie.Expires = DateTime.Now.AddMonths(2); 
Response.Cookies.Add(panelIdCookie); 

// lesen Cookie

var httpCookie = Request.Cookies["panelIdCookie"]; 
       if (httpCookie != null) 
       { 
        panelId = Convert.ToInt32(httpCookie["panelId"]); 
       } 
tun
32

Obwohl die akzeptierte Antwort korrekt ist, d oes gibt nicht an, warum der ursprüngliche Code nicht funktioniert hat.

Bad Code aus Ihrer Frage:

HttpCookie userid = new HttpCookie("userid", objUser.id.ToString()); 
userid.Expires.AddYears(1); 
Response.Cookies.Add(userid); 

einen Blick auf die zweite Linie nehmen. Die Basis für den Ablauf ist die Expires-Eigenschaft, die den Standardwert 1/1/0001 enthält. Der obige Code wird zu 1/1/0002 ausgewertet. Außerdem wird die Auswertung nicht in der Eigenschaft gespeichert. Stattdessen sollte die Expires-Eigenschaft auf der Grundlage des aktuellen Datums festgelegt werden.

Corrected Code:

HttpCookie userid = new HttpCookie("userid", objUser.id.ToString()); 
userid.Expires = DateTime.Now.AddYears(1); 
Response.Cookies.Add(userid); 
1

Wie ich verstehe Sie ASP.NET-Authentifizierung verwenden und Cookies setzen persistent müssen Sie festlegen FormsAuthenticationTicket.IsPersistent = true Es ist die Hauptidee.

bool isPersisted = true; 
var authTicket = new FormsAuthenticationTicket(
1, 
user_name, 
DateTime.Now, 
DateTime.Now.AddYears(1),//Expiration (you can set it to 1 year) 
isPersisted,//THIS IS THE MAIN FLAG 
addition_data); 
    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, authTicket); 
    if (isPersisted) 
     authCookie.Expires = authTicket.Expiration; 

HttpContext.Current.Response.Cookies.Add(authCookie);