在不同的端口之间共享Cookie

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

请求工作stream程如下:

  • 浏览器向应用程序1发送请求
  • 应用程序1发回一些cookie
  • 稍后在浏览器上发送请求到应用程序2
  • ^问题是最后一步,cookies不包含在请求中。

我已经尝试/理解的事情:

  • 我知道这是一个同源策略限制,并且由于不同的端口号,浏览器将它们视为不同的域。
  • 在应用程序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,但浏览器似乎忽略了它。

这里是我的阿贾克斯调用:

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

你的域在本例中是一样的localhost,所以不应该有任何问题。

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

请参考SO中的这个另一个问题

rfc明确指出

介绍

由于历史原因,Cookie包含一些安全和隐私不足之处。 例如,服务器可以指示给定的cookie旨在用于“安全”连接,但是安全属性在存在活动networking攻击者的情况下不提供完整性。 同样,即使Web浏览器使用通常的“相同来源策略”隔离通过不同端口检索到的内容,给定主机的Cookie也会在该主机的所有端口之间共享。

我没有尝试自己。

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

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

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

所以,尽量不要在cookie中设置端口,并使用名称localhost代替parsing的ipaddress。

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

 127.0.0.1 myawesomesubdomain.thisdomainnotexist.com.tr 

然后将Cookie设置为不带端口的域

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

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

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

位于C:\Windows\System32\drivers\etc/etc/hosts

以下是您可以尝试的两种不同的解决scheme:

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