在不同端口之间共享 Cookie
Posted
技术标签:
【中文标题】在不同端口之间共享 Cookie【英文标题】:Sharing Cookie between different ports 【发布时间】: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 你是如何让它工作的? 【参考方案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】:您可以尝试以下两种不同的解决方案:
-
运行 Apache 服务器并将请求路由到任一服务器
在浏览器中禁用安全性(即同源策略)。
【讨论】:
【参考方案3】:为了共享 cookie,您的两个应用程序应该在同一个域中,例如 app1.myapp.com
和 app2.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.com
和 app2.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。以上是关于在不同端口之间共享 Cookie的主要内容,如果未能解决你的问题,请参考以下文章