2012-02-15 249 views
2

我试图让一个子域为整个域创建一个cookie,而不是仅仅使用属性cookie.domain的子域,所以这两个子域可以共享cookie信息。当我部署到IIS时,我创建了2个Cookie,一个用于域,另一个用于子域。这是为什么?当我更新cookie时,唯一得到更新的是子域1,呈现域cookie是无用的。为什么cookie.domain设置了两个cookie?

我试图通过我的代码来追踪这个,但在调试模式下运行visual studio并没有真正设置任何cookie,除非我不设置cookie.domain属性。离开domain.cookie我得到一个cookie设置为localhost,但只有一个cookie。有什么想法吗?

+0

向我们展示一些实际的代码可能会帮助我们更轻松地诊断问题。 – LukeH 2012-02-15 22:54:00

+0

确实如此,但我不确定哪些代码可能是负责任的,尽管也许创建这两个cookie是某种默认行为。请参阅下面的解决方案 – BeachBum 2012-02-16 15:14:56

回答

2

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

Visual Studio将调试到站点http:// localhost:[someport]。因此,如果代码设置为使用cookie.domain为mydomain.com创建cookie,则Cookie不会设置,因为浏览器知道您位于localhost而不是指定的域。为了弥补这一点,我把一个条目放在我的hosts文件中,以便mydomain.com指向127.0.0.1。然后我以调试模式启动了该站点。当网站作为本地主机发布时,我将browswer中的URL更改为http://subdomain.domain.com:[someport]并刷新。现在可以设置cookie。

这样做帮助我追踪我的代码,找到由我的子域网站创建的两个Cookie的问题。我发现,由于cookie.domain,mydomain.com cookie正在创建好(下面的CreateCookie方法)。但是,当我试图更新cookie的过期时(UpdateCookie在下面),它恢复到认为它应该使用子域cookie并继续并在没有找到时创建它。我只需要在设置cookie和更新过期之前再次设置cookie.domain。现在我只有一个cookie。

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; 
} 
0

您可以在httpCookies

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

集domain.com上web.config全域和子域设置这个cookie名称,而不是www.domain.com存档你说什么,对具有相同的cookie域和子域。类似的,你设置了这个cookie设置的认证参数取决于你所说的cookie。

在你的问题“为什么呢?”答案是,如果你没有为cookie设置这个参数,那么cookies实际上使用当前的主机名,所以如果子域的名字改变,它们就不同了。

+0

我试着通过在我的解决方案中注释掉我的cookie.domain行,并将httpCookies添加到web.config中。我仍然创建了两个Cookie,一个用于域,另一个用于子域。 – BeachBum 2012-02-16 15:57:49

相关问题