跨子域javascript陷阱设置Cookie

时间:2015-07-01 01:38:57

标签: javascript asp.net-mvc cookies

启用跨子域使用cookie时需要帮助。无法在javascript中将cookie设置为正确的值。我不确定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收到请求时正在做什么 一旦更改了datepicker,它将刷新到页面,在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 resouce选项卡中的域名不同。

_date = 30/07/2015; domain = .adomain.com&lt;&lt;我需要这个域设置 _date = 30/07/2015;域= sub.adomain.com

2 个答案:

答案 0 :(得分:5)

虽然我不是.NET专家,但可以在Set-Cookie标头中明确指定cookie的域。根据{{​​3}},如果您将标头中的域指定为example.com,那么该Cookie也可用于www.example.comsubdomain.example.com。子域名不被视为外部域名,因此不会违反安全规定。

在控制器中发送cookie之前,可能会添加类似的内容

cookie.Domain = "adomain.com";

答案 1 :(得分:2)

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

您可以尝试使用iFrame将Cookie设置为Facebook does this