我正在尝试使用属性cookie.domain获取一个子域来为整个域创建cookie,而不仅仅是其子域,这样两个子域就可以共享cookie信息。当我部署到IIS时,我会创建两个cookie,一个用于域,另一个用于子域。为什么?当我更新cookie时,唯一更新的是子域,这使得域cookie有点无用。
我试图通过我的代码来跟踪这一点,但在调试模式下运行visualstudio实际上根本不会设置任何cookie,除非我没有设置cookie.domain属性。离开domain.cookie,我得到一个设置为localhost的cookie,但只有一个cookie。有什么想法吗?
好吧,所以我终于回答了我自己的问题。我将首先解决第二个问题,关于在调试模式下运行网站:
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实际上使用当前主机名,因此如果子域的名字发生变化,它们就会不同。