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

Posted

技术标签:

【中文标题】如何在 ASP.NET 中创建持久性 cookie?【英文标题】:How can I create persistent cookies in ASP.NET? 【发布时间】:2011-03-09 14:15:47 【问题描述】:

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

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

现在我怎样才能让它持久化?

如果我在关闭浏览器后再次访问同一页面,我将无法恢复。

【问题讨论】:

【参考方案1】:

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

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;

【讨论】:

【参考方案2】:

您可以这样做。

写入持久性 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.

【讨论】:

读取持久性 cookie 代码对我不起作用。在这篇文章中查看我的答案。 您的代码在功能上与原始问题中发布的代码没有什么不同,但您的 cookie 会在 12 小时后过期,而 OP 会在一年后过期。 @Ortund 正如Chance 指出的那样,有一个关键的区别,OP 正在添加到默认时间 0001/01/01 而这个答案正在添加到当前时间。【参考方案3】:

FWIW 在未加密的 cookie 中存储用户 ID 之类的内容时要非常小心。这样做会使您的网站很容易出现 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;

【讨论】:

他说的是 FormsAuthentication cookie 吗?知道类型后为什么还要使用var 感谢您对安全问题的关注,但我正在对 cookie 使用加密! 因为变量的冗余说明是多余的。由于该问题专门将用户 ID 显示为存储在 cookie 中的值,因此 FormsAuth cookie 是该 IMO 最正确的解决方案。 @KimJongWoo 即使不为您的应用程序使用表单身份验证,您仍然可以使用这些功能来生成安全 cookie 我不需要指定这个cookie是一个授权cookie吗?【参考方案4】:

//添加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"]);
                

【讨论】:

【参考方案5】:

虽然接受的答案是正确的,但它没有说明为什么原始代码无法工作。

您的问题中的错误代码:

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

【讨论】:

【参考方案6】:

据我了解,您使用 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);

【讨论】:

以上是关于如何在 ASP.NET 中创建持久性 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net 中创建分层结构

asp.net 术语解释!

如何在 asp.net 中创建 RESTful Web 服务?

如何在 Web ASP.NET (.NET Framework) 中创建启动文件?

如何在 ASP.Net 中创建必须是通用的数据访问层?

如何在asp.net c#中创建连接字符串