跨子域设置 Cookies javascript 陷阱
Setting Cookies across sub domain javascript pitfall
需要帮助才能使 cookie 跨子域使用。无法将 cookie 设置为 javascript 中的正确值。我不确定 Javascript 是设置 cookie 失败还是 MVC.NET 拒绝请求 cookie。
浏览器不工作
- Chrome 43 (Windows)
- 火狐 38 (Windows)
- iOS 8 野生动物园
将我的 web.config
设置为使用 <httpCookies domain=".adomain.com" />
时,事情开始变得非常糟糕。
我有一些 javascript 代码,与 pickadate.js 日期选择器结合使用,它将 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;
但日期应该等于 31/07/2015,但我有重复项。 chrome 资源选项卡中的域不同。
_date=30/07/2015; domain=.adomain.com << 我需要它成为这个域设置
_date=30/07/2015;域名=sub.adomain.com
出于安全原因,这是不可能的。 detailed info here
您可以尝试使用 iFrame 来设置 cookie,如 Facebook does this。
虽然我不是 .NET 专家,但可以在 Set-Cookie header 中明确指定 cookie 的域。根据 RFC 6265,如果您将 header 中的域指定为 example.com
,则 cookie 也可用于 www.example.com
和 subdomain.example.com
。子域不被视为外部域,因此不属于安全违规行为。
可能在您的控制器中发送 cookie 之前添加类似的内容应该可行
cookie.Domain = "adomain.com";
需要帮助才能使 cookie 跨子域使用。无法将 cookie 设置为 javascript 中的正确值。我不确定 Javascript 是设置 cookie 失败还是 MVC.NET 拒绝请求 cookie。
浏览器不工作
- Chrome 43 (Windows)
- 火狐 38 (Windows)
- iOS 8 野生动物园
将我的 web.config
设置为使用 <httpCookies domain=".adomain.com" />
时,事情开始变得非常糟糕。
我有一些 javascript 代码,与 pickadate.js 日期选择器结合使用,它将 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;
但日期应该等于 31/07/2015,但我有重复项。 chrome 资源选项卡中的域不同。
_date=30/07/2015; domain=.adomain.com << 我需要它成为这个域设置 _date=30/07/2015;域名=sub.adomain.com
出于安全原因,这是不可能的。 detailed info here
您可以尝试使用 iFrame 来设置 cookie,如 Facebook does this。
虽然我不是 .NET 专家,但可以在 Set-Cookie header 中明确指定 cookie 的域。根据 RFC 6265,如果您将 header 中的域指定为 example.com
,则 cookie 也可用于 www.example.com
和 subdomain.example.com
。子域不被视为外部域,因此不属于安全违规行为。
可能在您的控制器中发送 cookie 之前添加类似的内容应该可行
cookie.Domain = "adomain.com";