在不同的端口之间共享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,但浏览器似乎忽略了它。
这里是我的阿贾克斯调用:
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.com
和app2.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:
- 运行Apache服务器并将请求路由到任一服务器
- 在浏览器中禁用安全性(即,相同的源策略)。