【问题标题】:Sharing Cookie between different ports在不同端口之间共享 Cookie
【发布时间】:2018-01-04 18:59:36
【问题描述】:

我有一个托管在端口:80 上的应用程序 1(C#)和托管在端口:3030 上的应用程序 2(nodejs)。两者都在本地主机上。

请求流程如下:

  • 浏览器向应用程序 1 发送请求
  • 应用程序 1 发回 cookie 的数量
  • 稍后浏览器将请求发送到应用程序 2
  • ^ 问题在最后一步,cookie 没有包含在请求中。

我尝试过/理解的事情:

  • 我了解这是同源策略限制,并且由于端口号不同,浏览器会将它们视为不同的域。
  • 在应用程序 1(它使用 System.Web.HttpCookie)中,我尝试将域设置为特定于端口的域(“127.0.0.1:3030”),但似乎浏览器不接受或忽略它。

    //c# code
    var testCookie1 = new HttpCookie("Test", "testValue");
    testCookie1.Domain = "127.0.0.1:3030";
    testCookie1.Path = "/";
    testCookie1.Expires = DateTime.Now.AddDays(1);
    Response.SetCookie(testCookie1);
    
    var testCookie2 = new HttpCookie("Test2", "testValue2");
    testCookie2.Domain = "127.0.0.1";
    testCookie2.Path = "/";
    testCookie2.Expires = DateTime.Now.AddDays(1);
    Response.SetCookie(testCookie2);
    

服务器发回一个带有端口号的 cookie,但浏览器似乎忽略了它。

这是我的 ajax 调用:

   var request = $.ajax({
        url: 'http://127.0.0.1:3030/SomeTask',
        type: 'POST',
        crossDomain: true,
    });

【问题讨论】:

  • 两台服务器正在相互通信,在舞台/生产级别这将很容易实现,因为它们将具有相同的域和相同的端口 (80),但我正试图让它在本地主机上工作以获取开发环境。 @CodeCaster
  • 你是如何让它工作的?

标签: c# node.js google-chrome http cookies


【解决方案1】:

在这种情况下,您的域是相同的 localhost,所以应该没有任何问题。

另一件事是:端口是 URI 的一部分,而不是域的一部分,域也是 URI 的一部分,所以你是在混合苹果和水果......

请参考这个another question in SO

rfc 明确说明

简介

由于历史原因,cookie 包含许多安全和隐私方面的缺陷。例如,服务器可以指示给定的 cookie 用于“安全”连接,但 Secure 属性在存在活动网络攻击者的情况下不提供完整性。 同样,给定主机的 cookie 在该主机上的所有端口之间共享,即使网络浏览器使用的通常“同源策略”会隔离通过不同端口检索的内容。

我自己没试过。

在我的工作中,我们必须在子域(而不是端口)之间共享 cookie,并在域前面设置一个点

var testCookie1 = new HttpCookie("Test", "testValue"); testCookie1.Domain = "." + mydomain;

这样 x.mydomain 和 y.mydomain 将共享 cookie。

所以,尽量不要在 cookie 中设置端口,而是使用名称 localhost 而不是解析的 ipaddress。

您可以在主机文件中模拟生产设置,例如:

127.0.0.1   myawesomesubdomain.thisdomainnotexist.com.tr

然后将 cookie 设置为没有端口的域

【讨论】:

    【解决方案2】:

    您可以尝试以下两种不同的解决方案:

    1. 运行 Apache 服务器并将请求路由到任一服务器
    2. 在浏览器中禁用安全性(即同源策略)。

    【讨论】:

      【解决方案3】:

      为了共享 cookie,您的两个应用程序应该在同一个域中,例如 app1.myapp.comapp2.myapp.com,这样它们都可以访问 myapp.com cookie。

      你可以在本地模拟这个,通过设置:

      127.0.0.1 app1.myapp.com
      127.0.0.1 app2.myapp.com
      

      在位于C:\Windows\System32\drivers\etc/etc/hosts 的主机文件中

      【讨论】:

      • 请解释这在生产中是如何工作的。您确定不希望访问者编辑他们的主机文件吗?
      • 在生产中,您将在 DNS 中注册 app1.myapp.comapp2.myapp.com
      • 我按照您的示例进行操作,我理解两个应用程序需要位于同一域下才能共享 cookie 的概念,但我没有看到指向同一 IP 的两个不同域会有什么帮助。我的 app2 位于 127.0.0.1:3030。我确实尝试使用 fidler 设置 HOST 脚本以将 app2 域转发到 127.0.0.1:3030 所以我最终有 2 个具有域的应用程序:app1.myapp.com 和 app2.myapp.com 但似乎 cookie 仍然没有被发送到 app2。
      • 当你设置cookie时,你应该把它的域设置为myapp.com,这样它就可以在所有子域之间共享。详情请见here
      猜你喜欢
      • 2014-11-24
      • 2021-09-18
      • 2019-07-23
      • 2013-07-20
      • 1970-01-01
      • 2014-07-29
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多