如何通过使用 CookieAuthenticationMiddleware ASP.NET MVC 在内部验证 Cook



我试图弄清楚 ASP.NET 如何在内部验证cookie是否允许用户访问应用程序。

Cookie 身份验证中间件将设置 .具有加密值的 AspNet.Cookie。.NET 根据请求成功解密 cookie 后,将进行什么验证?

如果我有一个在用户登录后设置身份验证 Cookie 的应用程序 ,并且我创建了一个完整的新应用程序 ,也在本地主机上运行,并且我也使用 CookieAuthentication,则使用 IISExpress 进行本地开发。当我访问#2时,它将从#1读取cookie,并允许用户也访问应用程序。

我正在尝试了解 cookie 身份验证的限制是什么。

本身并没有真正的"验证"。Cookie 的加密密钥用于引用应"登录"的用户。它的工作方式与会话非常相似,其中会话 cookie 保存一个加密的会话 ID,服务器可以使用该 ID 来查找和恢复会话。

加密/解密基于计算机密钥,该密钥可以在 Web.config 中显式设置,也可以由 ASP.NET 自动生成。只有共享同一计算机密钥的应用程序才能解密 Cookie,这就是为什么保护您的计算机密钥如此重要的原因。

无论如何,这里涉及两个因素。首先,Cookie 是域绑定的:只有设置了 cookie 的域的域或子域才会被赋予 cookie。这由客户端(即浏览器)处理。您的两个应用程序目前都能够看到 cookie,因为它们都在本地主机上运行。但是,如果您要在 foo.com 部署一个,在 bar.com 部署另一个,则它们将无法再看到彼此的 cookie。

其次,计算机密钥通常由服务器提供(除非在每个应用的 Web.config 中显式设置它)。因此,在同一台计算机上运行的网站通常可以解密彼此的cookie(假设他们首先看到它们,这同样基于他们的域)。

目前尚不清楚你是否对这种安排感到满意。如果您的目标是隔离本地运行的两个站点,以便它们不共享 Cookie,您有几个选择。

  1. 可以在每个站点各自的 Web.config 文件中为每个站点显式设置不同的计算机密钥。他们仍然会收到其他网站设置的任何 cookie,但他们将无法再解密它们,这基本上会导致它们被忽略。

  2. 您可以自定义身份验证 Cookie 名称。您可以创建一个.Site1.Auth,另一个.Site2.Auth,而不是使用默认的cookie名称。然后,即使任何一个站点也将收到另一个站点的 cookie,它也会简单地忽略它,因为它不是它的身份验证 cookie。

但是,如果您打算在生产中也依赖此行为(即您实际上希望登录到一个站点以将您也登录到另一个站点),则需要在两个站点的 Web.config 文件中将计算机密钥显式设置为相同的值。此外,您需要将它们部署在同一域上,或者至少部署在该域的子域上。对于子域,您需要将 cookie 域设置为通配符域,.mydomain.com两者。然后,你可以在foo.mydomain.com有一个,在bar.mydomain.com有一个,他们都会看到饼干,因为它是放在.mydomain.com上的。如果您将其保留为默认值,在站点的实际域上设置,则bar.mydomain.com看不到foo.mydomain.com设置的cookie,因为该cookie将仅显式设置为foo.mydomain.com

主要验证是加密和过期。如果应用共享加密上下文(例如计算机密钥),则它们可以共享身份验证 cookie(前提是满足域和路径等其他客户端共享规则)。所以是的,默认情况下,在同一台计算机上使用 IIS Express 本地主机的两个应用程序预计会共享 cookie。

过期时间也嵌入在加密值中,因此客户端无法篡改它。