【发布时间】:2010-07-19 23:24:37
【问题描述】:
当我检查我的 HttpContext.Current.Request.Cookies 集合时,我的一些 cookie 的域成员为 null。
为什么/什么时候域为空?
【问题讨论】:
标签: asp.net cookies httprequest
当我检查我的 HttpContext.Current.Request.Cookies 集合时,我的一些 cookie 的域成员为 null。
为什么/什么时候域为空?
【问题讨论】:
标签: asp.net cookies httprequest
域属性仅用于设置 cookie。显然,如果您将 cookie 作为请求的一部分读取,则客户端浏览器会认为该域与您的站点适当匹配。
【讨论】:
默认情况下,Cookie 与当前域相关联。
所以如果在现场
www.foo.com
然后您执行以下操作:
HttpCookie appCookie = new HttpCookie("AppCookie");
appCookie.Value = "written " + DateTime.Now.ToString();
appCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(appCookie);
域名将是
www.foo.com
.
但是,您可以通过设置域的范围来覆盖此功能:
Response.Cookies["AppCookie"].Domain = "bar.foo.com";
该 cookie 将仅可用于该特定子域中的请求。
当然,您可以将 Domain 设置为 NULL,但我无法想象这样的场景会有用。
检查您是如何创建 cookie 的。
【讨论】:
HttpCookie 的 Domain 成员为 null 当 .Net 框架构造 HttpCookie 类的实例时,从存储在运行时配置文件 (system.web/httpCookies) 中的值初始化其值,并且该成员不会被另一个值(未指定)覆盖。这个unspecified值表示cookie应该由用户代理(通常是浏览器)发送到只发送cookie的服务器而不是其他服务器。
根据互联网提出的标准RFC6265 HTTP State Management Mechanism:
如果服务器省略域属性,用户代理将 仅将 cookie 返回到源服务器。
警告:一些现有的用户代理会处理缺失的域 属性好像域属性存在并包含 当前主机名。例如,如果 example.com 返回一个 没有域属性的 Set-Cookie 标头,这些用户代理将 错误地将 cookie 也发送到 www.example.com。
RFC 没有为 unspecified 定义任何特定值,因此实现者可以选择他们喜欢的任何值。 Microsoft 选择将域成员表示为字符串值,因此 null 或 "" (String.Empty) 表示 未指定,但隐式配置的默认值是 null。
如果您收到的 cookie 的域值为 null,则表示用户代理处理了 cookie,确定其来源与发送请求的服务器匹配,并将 cookie 数据包含在请求的 @987654330 中@标头。同样,如果您要返回该 cookie,您可能希望在另一个请求中仅由运行您的应用程序的同一主机接收该 cookie。
在 ASP.Net 应用程序中,如果 string.IsNullOrEmpty(cookie.Domain) 为真,您可以假设用户代理在对服务器的请求中包含了 cookie,它决定为原始主机,即 Request.Url.Host。
【讨论】: