在不同端口之间共享Cookie

19

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

请求的工作流程如下:

  • 浏览器发送请求到应用程序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 存储在浏览器中的 Cookie

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

这是我的 Ajax 调用:

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

1
两个服务器正在相互通信,在生产环境中,这将很容易实现,因为它们将拥有相同的域和相同的端口(80),但我正在努力使其在本地开发环境中正常工作。@CodeCaster - scorpion5211
你是如何让它工作的? - lbris
3个回答

11

在这种情况下,您的域名仍为localhost,因此不应该有任何问题。

另一件事是:端口是URI的一部分,而不是域名的一部分;域名也是URI的一部分,因此您正在混淆概念。

请参考SO上的另一个问题

RFC清楚地说明:

介绍

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

我自己没有尝试过。

在我的工作中,我们必须在子域之间共享Cookie(而不是端口),将一个点放在域名前面即可:

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

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

因此,请尝试不要在Cookie中设置端口,并使用名称localhost代替解析后的IP地址。

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

127.0.0.1   myawesomesubdomain.thisdomainnotexist.com.tr

然后将Cookie设置为该域名,不包括端口号


2

以下是两种不同的解决方案:

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

1
为了共享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 的主机文件中


请解释一下这在生产环境中如何运作。您肯定不希望访问者编辑他们的主机文件吧? - CodeCaster
1
在生产环境中,您的 DNS 中将注册 app1.myapp.comapp2.myapp.com - Gabriel Bleu
我按照你的例子操作了,我理解这两个应用程序需要在同一域名下才能共享cookies的概念,但我不明白如何让指向相同IP的两个不同域名有所帮助。我的app2位于127.0.0.1:3030上。我尝试使用Fidler设置HOST脚本将app2域名转发到127.0.0.1:3030,因此我最终拥有了两个具有以下域名的应用程序:app1.myapp.com和app2.myapp.com,但似乎cookie仍然无法发送到app2。 - scorpion5211
1
当您设置cookie时,应将其域设置为myapp.com,这样它就可以在所有子域中共享。有关详细信息,请参见此处 - Gabriel Bleu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接