English 中文(简体)
有指定域域或没有指定域(浏览器不一致)的曲子
原标题:Cookies with and without the Domain Specified (browser inconsistency)

我注意到在饼干方面 浏览器之间确实有些不一致

这将是相当长的时间,所以我忍不住。

注: 我在我的主机文件中设置了一个域名, 名为“ 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饼干

IE, 1 cookie 和 域名明确设置

歌剧: 1个曲奇曲

Opera 1 cookie 和 域名明确设置

火狐: 1个饼干

"https://i.sstatic.net/o8ZCE.png" alt="Firefox 配有1个曲奇和明确设置的域名"/ >

铬:1饼干

Chrome 1 cookie 和 明确设置的域名

您可以看到, 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 和 域名明确设置"/ >

铬 :

Chroome, 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="此处输入图像描述"/ >


现在你也许在想这一切

那么:

  1. When you access the cookie by Name in C#, it gives you 1 cookie. (the first cookie that has that name)
  2. The browser sends ALL cookies to the server
  3. 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)
  4. 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 上方, 这打破了一个多租户系统...

最佳回答

@WilliamBZA建议帮助解决最初的问题, 但签署/会期超时错误导致曲奇创建了隐含域曲奇,

不要在.NET... 中使用明确的 cookie 。 永远

问题太多, 确定这些问题可以通过在表格/ 域、 Cookie/ 域等上清晰显示来解决。 以确保正确的域被无处不在地使用。 但如果您的应用程序包含多个域或多租户, 那么问题就太大了 。

学习教训。 不要使用明确的饼干 。

问题回答

无法帮助 为何对饼干区别对待 , 但快速修正是每个子应用程序使用不同的饼干名称, 而不是使用 cookie 域 。

在表格验证的情况下,更改 ASPXAUTH cookie 的名称。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签