【问题标题】:why does cookie.domain set two cookies?为什么 cookie.domain 设置两个 cookie?
【发布时间】:2012-02-16 23:28:23
【问题描述】:

我正在尝试获取一个子域来为整个域创建一个 cookie,而不仅仅是使用属性 cookie.domain 的子域,因此两个子域可以共享 cookie 信息。当我部署到 IIS 时,我创建了 2 个 cookie,一个用于域,另一个用于子域。这是为什么?当我更新 cookie 时,唯一被更新的是子域,这使得域 cookie 变得毫无用处。

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

【问题讨论】:

  • 向我们展示一些实际代码可能有助于我们更轻松地诊断问题。
  • 太真实了,但我不确定哪个代码可能负责,尽管创建两个 cookie 可能是某种默认行为。请参阅下面的解决方案。

标签: c# asp.net cookies


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    设置 domain.com 而不是 www.domain.com 来存档您所说的内容,以便在域和子域上拥有相同的 cookie。类似地,您设置此 cookie 设置的身份验证参数,取决于您所说的 cookie。

    在您的问题“为什么会这样?”答案是,如果你不为cookies设置这个参数,那么cookies实际上使用当前的主机名,所以如果子域的名字发生变化,它们就会不同。

    【讨论】:

    • 我通过在下面的解决方案中注释掉我的 cookie.domain 行并将 httpCookies 添加到 web.config 来尝试此操作。我仍然创建了两个 cookie,一个用于域,另一个用于子域。
    猜你喜欢
    • 2012-05-15
    • 2013-06-23
    • 2017-10-16
    • 2020-05-24
    • 1970-01-01
    • 2012-02-21
    • 2015-07-24
    • 2020-12-05
    • 2011-10-21
    相关资源
    最近更新 更多