ASP.NET 中理解和实现 Cookie 的初学者指南






4.88/5 (16投票s)
本文讨论了 Cookie 的基础知识。文章阐述了什么是 Cookie,为什么需要它们,如何在 ASP.NET 中实现它们,以及使用 Cookie 时可能出现的问题。
- 引言
- 背景
- 使用代码
- Cookie 属性
- 在 ASP.NET 中实现 Cookie
- Cookie 可能出现的问题
- Session Cookies 的工作原理
- Forms Authentication 中 Cookie 的使用
- 理解 Cookie 篡改
- 关注点
- 历史
- 参考文献
引言
本文讨论了 Cookie 的基础知识。文章阐述了什么是 Cookie,为什么需要它们,如何在 ASP.NET 中实现它们,以及使用 Cookie 时可能出现的问题。
背景
什么是 Cookie
Cookie 是当客户端浏览器访问网站时,Web 服务器在客户端机器上写入的小文本文件。Cookie 可以以纯文本形式存储,也可以以加密形式存储。
第一个显而易见的问题是,为什么我们需要 Cookie。答案在于 Web 应用程序的无状态性质。由于 Web 应用程序是无状态的,我们需要某种方式来管理当前客户端请求的状态。状态管理可以在服务器端或客户端进行。Cookie 实际上用于识别用户并促进状态管理。
注意:还有各种其他状态管理技术。Cookie 是客户端状态管理技术,也有其他可用的客户端状态管理技术。请参阅 [1] 文章以了解所有关于状态管理和所有类型的状态管理技术。
Cookie 的类型
Cookie 可以根据其生命周期行为和存储的域分为各种类型。主要类型的 Cookie 有
- 会话 Cookie (Session Cookies)
- 持久性 Cookie (Persistent Cookies)
- 安全 Cookie (Secure Cookies)
- 第三方 Cookie (Third Party Cookies)
会话 Cookie:此 Cookie 存在于客户端计算机的内存中,其生命周期取决于当前的浏览器会话。如果用户关闭浏览器,这些 Cookie 将从客户端机器中删除。如果用户在关闭浏览器后再次访问网站,这些 Cookie 将不可用。
持久性 Cookie:持久性 Cookie 是存储在客户端机器辅助存储上的 Cookie。这些 Cookie 不依赖于浏览器会话。如果用户关闭浏览器然后再次访问网站,这些 Cookie 仍然可用。这些 Cookie 的生命周期在 Cookie 本身中指定(作为过期时间)。此类 Cookie 的最长时限可以是 1 年。
安全 Cookie:这些 Cookie 具有安全属性。这些 Cookie 只能通过 HTTPS 连接访问,而不能通过 HTTP
连接访问。拥有此类 Cookie 的原因是它减少了 Cookie 被窃取/窃听的可能性(稍后将在文章中详细讨论)
HttpOnly Cookie:此模式将允许 Cookie 仅通过 HTTP
或 HTTPS
请求访问。此类 Cookie 将无法通过任何其他方法(例如 JavaScript API)访问。
第三方 Cookie:第一方 Cookie 是将 Cookie 的域设置为与正在浏览的网站的域或子域相同的 Cookie。另一方面,第三方 Cookie 是将其域设置为与正在浏览的网站不同的域的 Cookie。这些 Cookie 主要用于跟踪用户浏览模式和/或为用户查找广告推荐。
Cookie 的用途
Cookie 的主要用途是
状态管理(会话管理)
状态管理可以使用 Cookie 来完成。Cookie 本身是进行客户端状态管理的一种非常好的方式,它要求在网站访问之间记住状态。
除了作为客户端状态管理之外,Cookie 在维护服务器上的会话方面也非常有用。Session
作为一种服务器端状态管理技术,将所有与状态相关的数据存储在服务器上。但服务器仍然需要唯一地识别客户端,以便将正确的会话数据与之关联。这由 Cookies
来实现。
ASP.NET 角色和成员资格
以及 自定义表单身份验证
也使用 Cookie 进行身份验证和授权。有关这些主题的详细信息,请参阅以下文章 [3]、[2]。本文末尾有一个专门讨论 Cookie 在会话管理中详细使用的部分。
网页个性化
网页个性化也可以使用 Cookie 实现。用户可以设置他们的个性化偏好,这些偏好可以保存在服务器上。通过使用 Cookie,我们可以识别同一用户,然后为他加载个性化版本。
ASP.NET 中的 用户配置文件
,如果跟踪匿名用户,也使用 Cookie 来跟踪匿名用户。有关用户个性化的更多信息可以在这里找到 [4]
跟踪用户
Cookie 也用于跟踪用户浏览模式。这主要是为了识别用户是首次访问网站还是回访用户。此外,这样做是为了为用户查找广告推荐。
使用代码
Cookie 属性
理解 Cookie 属性很重要。因为 Cookie 的生命和行为由 Cookie 属性决定。现在让我们讨论一些重要的 Cookie 属性。
安全 (Secure): 当指定此属性时,Cookie 只能通过 HTTPS 访问。这减少了 Cookie 被窃取或窃听的机会。
域和路径 (Domain and Path): 这两个属性用于识别此 Cookie 所设置的网站及其特定的 URL。
HTTPOnly: 使用此属性,Cookie 被强制只能通过 HTTP 或 HTTPS 使用。这减少了跨站脚本的风险,因为 JavaScript API 将无法访问 Cookie。
过期 (Expires): 此属性指定 Cookie 是持久性还是非持久性。如果我们不指定此属性,Cookie 将是非持久性的,即关闭浏览器将从浏览器内存中删除 Cookie。如果指定此属性,则 Cookie 将写入客户端机器,并且在达到此属性中指定的时间之前有效。
在 ASP.NET 中实现 Cookie
现在让我们看看如何使用 ASP.NET 实现 Cookie。我们将开发一个小型示例应用程序,该应用程序将使用 Cookie 来跟踪用户的姓名和上次访问此网站的时间。我们将使用持久性 Cookie 来记住此信息。
让我们从一个简单的页面开始,该页面显示用户信息,即姓名和上次访问时间。实现所需功能的基本算法将是
- 我们将检查 Cookie 中是否存在上次访问时间。
- 如果不存在,那么这可能是用户首次访问该网站。
- 我们将向他显示默认文本。
- 将用户访问时间保存在 Cookie 中。
- 如果用户选择保存他的姓名,则将他的姓名保存在 Cookie 中。
- 如果 Cookie 存在
- 从 Cookie 加载数据
- 显示上次访问时间
- 如果他的用户名存在则显示
- 将当前时间更新为 Cookie 中的上次访问时间
- 如果用户选择保存他的姓名,则将他的姓名保存在 Cookie 中。
我们将创建的所有 Cookie 都是持久性 Cookie,即我们将为 Cookie 指定过期时间。让我们看看如何用代码实现上述算法。
protected void Page_Load(object sender, EventArgs e)
{
//let us check if the cookie for username exist or not
if (Request.Cookies["UName"] != null)
{
Label1.Text = Request.Cookies["UName"].Value;
}
else
{
Label1.Text = "Guest";
}
//Let us check if the time of last visit exist or not
if (Request.Cookies["LVisit"] != null)
{
Label2.Text = Request.Cookies["LVisit"].Value;
}
else
{
Label2.Text = "Never";
}
if (IsPostBack == false)
{
// Whenever user visit this page or move away from the page lets write the cookie
// that tracks the last visit time
HttpCookie cookie = new HttpCookie("LVisit");
//Set the cookie value
cookie.Value = DateTime.Now.ToString();
//make it a persistant cookie by setting the expiration time
cookie.Expires = DateTime.Now.AddDays(1);
//Push the cookie to the client computer.
Response.Cookies.Add(cookie);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
HttpCookie cookie = new HttpCookie("UName");
//Set the cookie value
cookie.Value = TextBox1.Text;
//make it a persistant cookie by setting the expiration time
cookie.Expires = DateTime.Now.AddDays(1);
//Push the cookie to the client computer.
Response.Cookies.Add(cookie);
Label1.Text = TextBox1.Text;
}
所以让我们第一次运行页面。
因此,这次它显示的是默认文本,因为系统中不存在包含数据的 Cookie。现在让我们保存姓名并关闭浏览器。当我再次打开浏览器时,我的数据显示出来了,因为它们存储在用户计算机上的 Cookie 中。

如果我想查看实际的 Cookie 文件,我可以在 "C:\Document and Settings\USERNAME\Cookies"
文件夹中找到它。要查看这些文件,我必须设置文件夹选项以查看隐藏文件和操作系统文件。

当在 Internet Explorer 中查看 Cookie 本身时
现在我们有了一个基本的应用程序,具有读写 Cookie 的功能。示例代码只包含读写和设置过期时间的代码。其他 Cookie 属性也可以以类似的方式设置。
Cookie 可能出现的问题
由于 Cookie 数据在客户端和服务器之间通过网络传输,因此 Cookie 有可能在传输过程中被截获,并且有人可能使用它来模仿我们在服务器上的会话。对于持久性 Cookie,我们绝不应该在 Cookie 中保存敏感数据,因为任何人都可以读取它们。使用 Cookie 的另一个限制是它们的大小。浏览器通常限制 Cookie 文件的大小(大多数情况下为 4MB
),这就是我们应该避免在 Cookie 中存储大量数据的原因。
Session Cookies 的工作原理
正如我们上面讨论的,Cookie 也用于维护会话信息。了解其工作原理是必要的。这种理解对于 ASP.NET 开发人员来说绝对非常有益。
- 创建用户会话并将数据存储在会话变量中。
- 唯一的会话标识符写入非持久性 Cookie 中。
- 每当向服务器发出请求时,都会读取 Cookie 数据并提取唯一标识符。
- 然后使用此唯一标识符映射到服务器内存中保存的用户特定数据。
Forms Authentication 中 Cookie 的使用
ASP.NET 自定义表单身份验证也使用相同的机制。它还会加密 Cookie,因此即使 Cookie 保存在磁盘上,也没有人能够访问它。
- 要求用户输入其
登录
凭据。 - 以持久或非持久模式生成用户特定的加密 Cookie
- 每当需要授权时,都会读取此 Cookie 并检查用户的授权。
在上述方法中,如果用户希望保存其 登录
凭据并希望在访问之间保持登录状态,则 Cookie 应该是持久性 Cookie,否则它应该是非持久性 Cookie。
注意: 有关 Forms 身份验证的详细信息可在此处找到:[2]
理解 Cookie 篡改
现在我们已经看到,Cookie 在 ASP.NET 框架中最关键的用途是跟踪会话和实现表单身份验证。那么如果用户在其浏览器中禁用了 Cookie 会怎样?
如果用户禁用了 Cookie,那么 ASP.NET 框架会使用 URL 来跟踪会话和身份验证数据。唯一的会话 ID 会被放入 urls
中并用于跟踪用户会话。如果网页包含链接,即 hrefs
,那么相同的会话 ID 也会与所有 href 链接关联。ASP.NET 术语中,此过程称为 Cookie 篡改(Cookie munging)。
关注点
本文中我们探讨了 Cookie 的基本知识。我们尝试了解了 Cookie 何时何地有利且有必要。我们实现了一个小型应用程序来设置和获取 Cookie。我们还解释了 ASP.NET 如何在内部使用 Cookie 来管理会话和用户配置文件信息。本文从绝对初学者的角度编写。我希望它能提供有益的信息。
历史
- 2012 年 7 月 16 日: 第一个版本。