在不同端口之间共享Cookie

sco*_*211 9 c# cookies google-chrome http node.js

我有一个托管在端口:80上的application1(C#)和托管在端口:3030上的应用程序2(nodejs).两者都在localhost上.

请求工作流程如下:

  • 浏览器向应用程序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);
    
    Run Code Online (Sandbox Code Playgroud)

从服务器返回的Cookie 存储在浏览器中的Cookie

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

这是我的ajax调用:

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

dar*_*ffo 7

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

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

请参考SO中的另一个问题

该委员会明确指出

介绍

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

我自己没试过.

在我的工作中,我们必须在子域(而不是端口)之间共享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
Run Code Online (Sandbox Code Playgroud)

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