gpt4 book ai didi

c# - 带有和不带有指定域的 Cookie(浏览器不一致)

转载 作者:IT王子 更新时间:2023-10-29 03:54:10 26 4
gpt4 key购买 nike

我注意到浏览器之间在 cookie 方面存在一些真正的不一致。

这将是相当长的所以请耐心等待。

注:我在我的主机文件中设置了一个名为“testdomain.com”的域,这个错误在使用“localhost”时不会起作用。

注2:我很想知道这在 Apache/PHP 上是如何工作的,如果当您按名称检索 cookie 时,如果它返回一组 cookie。

维基百科

维基百科指出: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 在 cookie 规范中声明: http://www.w3.org/Protocols/rfc2109/rfc2109

Domain=domain

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
});

我们明确地按下了主机名,我们应该在 cookie 上设置一个以点为前缀的域名,在这种情况下它应该是“.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 个 cookies

IE with 1 cookie and domain explicitly set

歌剧:1个 cookies

Opera with 1 cookie and domain explicitly set

火狐:1 个 cookie

Firefox with 1 cookie and domain explicitly set

Chrome :1个 cookies

Chrome with 1 cookie and domain explicitly set

如您所见,Opera 和 IE 都设置了一个没有点前缀的 EXPLICIT 域。

Firefox 和 Chrome 都使用点前缀设置 EXPLICIT 域。

如果我使用以下代码:
Response.Cookies.Add(new HttpCookie("Banana", "2")
{

});

IE/Opera:两者具有完全相同的结果,域没有点前缀。

有趣的是,Firefox 和 Chrome 都创建了没有点前缀的 cookie。

(我清除了所有 cookie 并再次运行代码)

火狐:

Firefox with 1 cookie and domain explicitly set

Chrome 合金:

Chrome with 1 cookie and domain explicitly set

有趣的位

这就是它变得有趣的地方。如果我像这样一个接一个地写 cookie:
Response.Cookies.Add(new HttpCookie("Banana", "1")
{
Domain = Request.Url.Host
});
Response.Cookies.Add(new HttpCookie("Banana", "2")
{

});

我个人希望浏览器中存在一个 cookie,因为我认为它基于 cookie 名称。

这是我观察到的:

在 IE/Opera 中,最后一个 cookie 集是使用的 cookie。这是因为 Cookie 名称和域名是相同的。

如果你明确定义了一个带点的域名,两个浏览器仍然会看到 1 个 cookie,最后一个同名的 cookie。

另一方面,Chrome 和 Firefox,看到不止 1 个 cookie:

我编写了以下 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 个 cookie 集(浏览器看到 1):

IE - 2 cookies set, the outcome

Opera - 2 个 cookie 集(浏览器看到 1 个):

enter image description here

Firefox - 设置了 2 个 cookie,浏览器看到 2 个!:

enter image description here

Chrome - 设置了 2 个 cookie,浏览器看到 2 个!:

enter image description here

现在你可能想知道这一切是什么。

好:
  • 当您在 C# 中按名称访问 cookie 时,它​​会为您提供 1 个 cookie。 (第一个具有该名称的 cookie)
  • 浏览器将所有 cookie 发送到服务器
  • 除了 cookie 的键/值之外,浏览器不会发送任何信息。 (这意味着服务器不关心域)
  • 如果您通过索引
  • 检索它们,您可以访问同名的两个 cookie。

    问题...

    当我们按下它时,我们必须更改我们的身份验证以在 cookie 中指定域。

    这破坏了 Chrome 和 Firefox,用户无法再登录,因为服务器会尝试验证旧的 auth cookie。这是因为(根据我的理解)它使用身份验证 Cookie 名称来检索 cookie。

    即使有两个 cookie,第一个被检索,恰好是旧的,身份验证失败,用户未登录。有时正确的 cookie 是列表中的第一个,身份验证成功......

    最初,我们通过推送带有旧域的 cookie 使其过期来解决此问题。这在 Chrome 和 Firefox 中有效。

    但它现在破坏了 IE/Opera,因为两个浏览器都不关心域,只根据名称比较 cookie。

    我的结论是,cookie 上的域完全是在浪费时间。

    假设我们必须指定域,并且我们不能依赖用户清除他们的浏览器缓存。我们如何解决这个问题?

    更新:

    深入了解 .NET 如何将用户注销。
    if (FormsAuthentication._CookieDomain != null)
    {
    httpCookie.Domain = FormsAuthentication._CookieDomain;
    }

    看起来 Forms 身份验证完全有可能推送过期的 Auth cookie,这与用户身份验证所用的 cookie 完全无关。它不使用当前 Auth Cookie 的域。

    它无论如何都不能使用,因为域不会通过 cookie 推送回服务器。

    更新 2

    看来 FormsAuthentication 真的坏了。如果在对用户进行身份验证时在 cookie 上使用显式域名,请等待 session 超时,然后刷新页面,FormsAuthentication 使用的 cookie 生成方法导致域为 null,从而导致浏览器分配一个无点域。

    它需要预先为表单分配一个域,以便将其分配给 cookie,这破坏了 Multi-Tenancy 系统......

    最佳答案

    @WilliamBZA 的建议帮助解决了最初的问题,但随后导致 cookie 创建隐式域 cookie 的注销/ session 超时错误让我得出结论,解决方案是......

    不要在 .NET 中使用显式 cookie... 永远

    问题太多了,肯定可以通过在Form/Domain、Cookie/Domain等上显式来解决。确保在任何地方都使用正确的域。但是,如果您的应用程序托管多个域或者是 Multi-Tenancy ,那么问题就太大了。

    教训是吸取了。不要使用显式 cookie。

    关于c# - 带有和不带有指定域的 Cookie(浏览器不一致),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10751813/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com