2010-06-29 2 views
61

Я создаю печенье со следующими строками:Как создать постоянные файлы cookie в asp.net?

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

Теперь Как сделать это настойчивым?

Потому что, если я снова зашел на ту же страницу после закрытия браузера, я не смогу вернуть его.

ответ

85

Вот как вы можете это сделать.

Написание постоянных файлов cookie.

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

Чтения упорного печенья.

//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

Чтение постоянного кода cookie не помогло мне. См. Мой ответ в этом сообщении. –

+3

Ваш код функционально ничем не отличается от того, который был опубликован в исходном вопросе, хотя за исключением того, что ваш файл cookie истекает через 12 часов, а OP - через год. – Ortund

+2

Этот файл cookie не является постоянным, если клиент закрывает браузер, в котором cookie исчезнет. Вопрос в том, как писать постоянный файл cookie, а не «cookie» сеанса. – Felype

0

Вы должны добавить это в качестве последней строки ...

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

Когда вам нужно прочитать значение куки, вы бы использовать метод, аналогичный этому:

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 быть очень осторожным с хранением что-то вроде идентификатору пользователя в куки зашифрованном виде. Это делает ваш сайт очень склонным к отравлению печенья, когда пользователи могут легко олицетворять другого пользователя. Если вы рассматриваете что-то подобное, я настоятельно рекомендую напрямую использовать cookie проверки подлинности форм.

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

Тогда вы можете прочитать в любое время на странице ASP.NET, выполнив

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

Он сказал, что файл cookie FormsAuthentication? И зачем использовать 'var', когда вы знаете тип. –

+0

Спасибо за беспокойство по поводу безопасности, но я использую шифрование для файлов cookie! – Vikas

+14

Поскольку избыточная спецификация переменных избыточна. И поскольку в вопросе конкретно указано, что userid является значением для хранения в cookie, cookie FormsAuth является самым правильным решением для этой IMO. –

0

// добавить печенье

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

// считываем печенье

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

Хотя принятый ответ верный, он d oes не указывает, почему исходный код не работал.

Плохой код из вашего вопроса:

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

Посмотрите на второй линии. Основанием для истечения срока действия является свойство Expires, которое содержит значение по умолчанию 1/1/0001. Вышеприведенный код оценивается до 1/1/0002. Кроме того, оценка не возвращается обратно в собственность. Вместо этого свойство Expires должно быть установлено с базой на текущую дату.

Исправленный код:

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

Как я понимаю, вы использовать проверку подлинности ASP.NET и установить куки настойчивый вам необходимо установить FormsAuthenticationTicket.IsPersistent = истинный Это основная идея.

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); 
Смежные вопросы