为什么cookie.domain要放两块饼干

本文关键字:两块 饼干 cookie domain 为什么 | 更新日期: 2023-09-27 18:24:58

我正在尝试使用属性cookie.domain获取一个子域来为整个域创建cookie,而不仅仅是其子域,这样两个子域就可以共享cookie信息。当我部署到IIS时,我会创建两个cookie,一个用于域,另一个用于子域。为什么?当我更新cookie时,唯一更新的是子域,这使得域cookie有点无用。

我试图通过我的代码来跟踪这一点,但在调试模式下运行visualstudio实际上根本不会设置任何cookie,除非我没有设置cookie.domain属性。离开domain.cookie,我得到一个设置为localhost的cookie,但只有一个cookie。有什么想法吗?

为什么cookie.domain要放两块饼干

好吧,所以我终于回答了我自己的问题。我将首先解决第二个问题,关于在调试模式下运行网站:

Visual studio调试到站点http://localhost:[someport]。因此,如果代码设置为使用cookie.domain为mydomain.com创建cookie,则不会设置cookie,因为浏览器知道您位于localhost,而不是指定的域。为了解决这个问题,我在hosts文件中放了一个条目,使mydomain.com指向127.0.0.1。然后我在调试模式下启动了网站。当该网站显示为localhost时,我将浏览器中的URL更改为http://subdomain.domain.com:[someport]并刷新。现在可以设置cookie了。

这样做帮助我追踪我的代码,发现我的子域网站创建了两个cookie的问题。我发现,由于cookie.domain,mydomain.com cookie的创建情况良好(下面的CreateCookie方法)。然而,当我试图更新cookie的过期时间(下面的UpdateCookie)时,它又认为应该使用子域cookie,并在找不到子域cookie时继续创建它。我所要做的就是在设置cookie和更新过期日期之前再次设置cookie.domain。现在我只有一块饼干。

public void CreateCookie()
{
    HttpCookie cookie = new HttpCookie(mConfig.webCookie);
    TimeSpan span = new TimeSpan(0, 0, 30, 0);
    DateTime time = DateTime.Now; ;
    cookie["Username"] = mEncrypt.Encrypt(mUser.Username);
    cookie.Domain = "mydomian.com";
    cookie.Expires = time + span;
    HttpContext.Current.Response.Cookies.Add(cookie);
}
public void UpdateCookie()
{ 
    TimeSpan span = new TimeSpan(0, 0, 30, 0);
    DateTime time = DateTime.Now;
    HttpCookie cookie = HttpContext.Current.Request.Cookies[mConfig.webCookie];
    // without specifying the domain the cookie will be set with the subdomain
    cookie.Domain = "mydomain.com";
    HttpContext.Current.Response.Cookies.Set(cookie);
    HttpContext.Current.Response.Cookies[mConfig.webCookie].Expires = time + span;
}

您可以在httpCookies 上为web.config上的完整域和子域设置此cookie名称

<httpCookies domain="domain.com" httpOnlyCookies="false" requireSSL="false" />

将domain.com和NOT www.domain.com设置为存档您所说的内容,以便在域和子域上拥有相同的cookie。类似地,还有一个关于身份验证的参数,您可以设置此cookie设置,这取决于您谈论的cookie。

在你的问题"为什么?"中,答案是,如果你没有为cookie设置此参数,那么cookie实际上使用当前主机名,因此如果子域的名字发生变化,它们就会不同。