如何在ASP.NET中创建持久性Cookie?


73

我正在使用以下行创建cookie:

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

现在如何使其持久化?

如果在关闭浏览器后再次访问同一页面,则无法找回。

Answers:


101

这是您可以执行的操作。

编写持久性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);

读取持久性cookie。

//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代码对我不起作用。在这篇文章中查看我的答案。
Diganta Kumar

7
您的代码在功能上与原始问题中发布的代码没有什么不同,尽管您的Cookie会在12小时后过期,OP会在一年内过期。
Ortund 2015年

2
@Ortund正如机会指出的,存在一个关键的区别,OP被添加到默认时间0001/01/01,而这个答案被添加到当前时间。

49

尽管接受的答案是正确的,但并未说明原始代码为何无法正常工作。

您问题中的错误代码:

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

26

FWIW在将用户名之类的内容存储在未加密的cookie中时要非常小心。这样做会使您的网站很容易出现Cookie中毒的情况,用户可以很容易地冒充其他用户。如果您正在考虑类似的事情,我强烈建议您直接使用表单身份验证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
他说过FormsAuthentication cookie吗?以及为什么var在知道类型时使用。
这个。__curious_geek

出于安全方面的考虑,谢谢您,但我正在使用cookie加密!
维卡斯2010年

15
因为冗余的变量说明是多余的。并且由于该问题专门将userid显示为要存储在cookie中的值,因此FormsAuth cookie是此IMO的最正确解决方案。
克里斯·马里西奇

1
@KimJongWoo即使不为应用程序使用表单身份验证,您仍然可以使用这些功能来生成安全的cookie
Chris Marisic 2013年

我是否不需要指定此Cookie是AuthorizationCookie的任何内容?
SoliQuiD

2

据我了解,您使用ASP.NET身份验证并设置cookie持久化,您需要设置FormsAuthenticationTicket.IsPersistent = true这是主要思想。

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

0

您需要将此添加为最后一行...

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

当您需要读取cookie的值时,可以使用类似于以下的方法:

    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;

0

//添加cookie

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

//读取Cookie

    var httpCookie = Request.Cookies["panelIdCookie"];
                if (httpCookie != null)
                {
                    panelId = Convert.ToInt32(httpCookie["panelId"]);
                }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.