【问题标题】:Setting Cookies across sub domain javascript pitfall跨子域设置 Cookie javascript 陷阱
【发布时间】:2015-09-18 00:23:13
【问题描述】:

在启用 cookie 以跨子域使用时需要协助。无法将 cookie 设置为 javascript 中的正确值。我不确定是 Javascript 未能设置 cookie 还是 MVC.NET 拒绝了请求 cookie。

浏览器不工作

  • Chrome 43 (Windows)
  • Firefox 38 (Windows)
  • iOS 8 Safari

当我将web.config 设置为使用<httpCookies domain=".adomain.com" /> 时,事情开始出现严重错误。

我有一些 javascript 代码,与 pickadate.js datepicker 结合使用,它将 cookie 值更改为用户选择的日期。

Javascript 函数

// Call pickadate API to retrieve selected date
var dateString = this.get('select', 'dd/mm/yyyy');

var cd = new Date();
var exp = cd.setMinutes(cd.getMinutes() + 10)

setCookie("_date", dateString, new Date(exp), "/", ".adomain.com");

window.location.reload();

function setCookie(name, value, expires, path, theDomain, secure) {
    value = escape(value);
    var theCookie = name + "=" + value +
    ((expires) ? "; expires=" + expires.toGMTString() : "") +
    ((path) ? "; path=" + path : "") +
    ((theDomain) ? "; domain=" + theDomain : "") +
    ((secure) ? "; secure" : "");
    document.cookie = theCookie;
}

.NET 收到请求时在做什么 更改日期选择器后,它将刷新到页面,发送带有 cookie 中日期的新请求。这是一个 MVC.NET 控制器。但是,cookie 在客户端并没有改变。

    if(this.ControllerContext.HttpContext.Request.Cookies.AllKeys.Contains("_date"))
{
     cookie.Value =   this.ControllerContext.HttpContext.Request.Cookies[sessionDate].Value;

     // Do some logic with date to retrieve products

} else {
     // Set cookie.value to today's date
}

cookie.HttpOnly = false;
cookie.Path = "/";
cookie.Secure = true;

this.ControllerContext.HttpContext.Response.Cookies.Set(cookie);

http 请求包含以下 _date 的重复项:

_date=30/07/2015; 
_date=31/07/2015; 

但日期应该等于 2015 年 7 月 31 日,但我有重复。 chrome 资源选项卡中的域不同。

_date=30/07/2015; domain=.adomain.com

【问题讨论】:

    标签: javascript asp.net-mvc cookies


    【解决方案1】:

    虽然我不是 .NET 专家,但可以在 Set-Cookie 标头中明确指定 cookie 的域。根据RFC 6265,如果您将标头中的域指定为example.com,那么www.example.comsubdomain.example.com 也可以使用cookie。子域不被视为外部域,因此不构成安全违规。

    在您的控制器中发送 cookie 之前添加类似这样的内容应该可以工作

    cookie.Domain = "adomain.com";

    【讨论】:

      【解决方案2】:

      出于安全原因,这是不可能的。 detailed info here

      您可以尝试使用 iFrame 来设置像 Facebook does this 这样的 cookie。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 2017-10-06
        • 2023-04-04
        • 2021-08-29
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        相关资源
        最近更新 更多