我注意到在饼干方面 浏览器之间确实有些不一致
这将是相当长的时间,所以我忍不住。
注: 我在我的主机文件中设置了一个域名, 名为“ testdomain. com”, 使用“ localhost” 时此域名 bug WONT 工作 。
Note2: 我很想知道这对Apache/PHP有什么用,如果你在取回一个名字的饼干时,如果它能让一个饼干收藏回来的话。
Wikipedia
维基百科指出:http://en.wikipedia.org/wiki/HTTP_cookie#Domain_and_Path
Domain and Path
The cookie domain and path define the scope of the cookie—they tell the browser that cookies should only be sent back to the server for the given domain and path. If not specified, they default to the domain and path of the object that was requested.
因此,如果我们推下去:
Response.Cookies.Add(new HttpCookie("Banana", "2")
{
});
我们应该用请求对象的域名来获取一个 cookie, 这个域名应该是“ testdomain. com ” 。
W3
W3在饼干规格中规定:http://www.w3.org/Protocs/rfc2109/rfc2109
域=域
Optional. The Domain attribute specifies the domain for which the cookie is valid. An explicitly specified domain must always start with a dot.
因此,如果我们推下去:
Response.Cookies.Add(new HttpCookie("Banana", "1")
{
Domain = Request.Url.Host
});
我们明确地推下主机名, 我们应该在饼干上设置一个域名, 以点为前缀, 在这种情况下, 它应该是“. testdomain. com ” 。
也指出维基百科上的内容:
Domain Defaults to the request-host. (Note that there is no dot at the beginning of request-host.)
跟我到现在为止?
如果我使用第一种方法, 定义一个域 :
Response.Cookies.Add(new HttpCookie("Banana", "1")
{
Domain = Request.Url.Host
});
其结果是:
IE9:1饼干
歌剧: 1个曲奇曲
火狐: 1个饼干
"https://i.sstatic.net/o8ZCE.png" alt="Firefox 配有1个曲奇和明确设置的域名"/ >
铬:1饼干
您可以看到, Opera 和 IE 都设置了一个没有点前缀的 EXPLIIT 域 。
Firefox 和 Chrome DO 用点前缀设置 EXPLIIT 域 。
如果我使用以下代码:
Response.Cookies.Add(new HttpCookie("Banana", "2")
{
});
IE / Opera: 两者的结果完全相同, 域没有点前缀 。
有趣的是,Firefox和Chrome 都创造了饼干,没有点前缀。
(我清理了所有的饼干 并运行代码再次)
烟雾 :
"https://i.sstatic.net/3Tgkd.png" alt="Firefox, 1 cookie 和 域名明确设置"/ >
铬 :
INTERESTING BIT
有趣的是,如果我把饼干一个接一个地写下来:
Response.Cookies.Add(new HttpCookie("Banana", "1")
{
Domain = Request.Url.Host
});
Response.Cookies.Add(new HttpCookie("Banana", "2")
{
});
我想在浏览器里会有一个饼干 因为我假设它是基于饼干的名字
我在这里观察到:
在 IE / Opera 中, LAST cookie 组是使用的 cookie 组。 因为 Cookie 和 Domen 名称相同 。
如果您用点来明确定义域名, 两个浏览器仍然会看到一个 cookie, 最后一个 cookie, 即同名的最后一个 cookie 。
另一方面,铬和火狐, 可以看到超过1个饼干:
我写了以下 JavaScript 来将数值放入页面:
<script type="text/javascript">
(function () {
var cookies = document.cookie.split( ; );
var output = "";
for (var i = 0; i < cookies.length; i++) {
output += "<li>Name " + cookies[i].split( = )[0];
output += " - Value " + cookies[i].split( = )[1] + "</li>";
}
document.write("<ul>" + output + "</ul>");
})();
</script>
这些成果如下:
IE - 2个饼干组( 浏览器看到 1) :
"https://i.sstatic.net/bDFVl.png" alt="IE - 2个饼干组,结果"/ >
Opera - 2个饼干组( 浏览器看到 1) :
""https://i.sstatic.net/Sl0r5.png" alt="此处输入图像描述"/"
Firefox - 2个饼干组和浏览器看到 2!
""https://i.sstatic.net/YvIe1.png" alt="此处输入图像描述"/ >
铬 - 2个饼干组和浏览器看到 2!
""https://i.sstatic.net/sWFf9.png" alt="此处输入图像描述"/ >
现在你也许在想这一切
那么:
- When you access the cookie by Name in C#, it gives you 1 cookie. (the first cookie that has that name)
- The browser sends ALL cookies to the server
- The browser doesn t send any information other than the key/value of the cookie. (this means the server doesn t care about the domain)
- You can access both cookies of the same name, if you retrieve them by index
问题...
我们不得不改变我们的认证 来指定在饼干中的域 当我们推下来时。
这个破碎的铬和Firefox, 用户无法再登录了, 因为服务器会尝试验证旧的auth cookie。 这是因为( 据我所知) 它使用认证 Cookie Name 来检索 cookie 。
即使是两个饼干, 第一个也是被检索的, 碰巧是旧的, 认证失败, 用户没有登录。 OTIMES 正确的 cookie 是列表中的第一个, 而认证成功...
起初,我们通过推着一个带有旧域的曲奇来解决这个问题。这在Chrome和Firefox中有效。
但是现在它打破了IE/Opera 因为两个浏览器都不在乎域名 只能根据名称比较饼干
我的结论是,饼干上的域 完全是浪费时间。
假设我们必须指定域名,我们不能依靠用户清除浏览器缓存。 我们如何解决这个问题?
Update:
正在挖掘.NET 如何标记用户退出 。
if (FormsAuthentication._CookieDomain != null)
{
httpCookie.Domain = FormsAuthentication._CookieDomain;
}
看来表格认证完全有可能推动过期的 Auth cookie, 这与用户认证的 cookie 完全无关。 它不使用当前 Auth Cookie 域 。
它无法使用, 因为域名没有带着 cookie 被推回服务器 。
Update 2
形式认证似乎真的被打破。 如果您在对用户进行认证时在饼干上使用明确的域名, 等待会话超时, 然后刷新页面, 生成表格认证中使用的饼干的方法导致域名无效, 导致浏览器指定一个无点域 。
它要求表格在前面指定一个域, 才能被指定到 cookie 上方, 这打破了一个多租户系统...