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

问题描述:

我想知道ASP.NET如何在内部验证Cookie是否允许用户访问应用程序。Cookie如何通过ASP.NET MVC使用CookieAuthenticationMiddleware在内部验证

CookieAuthenticationMiddleware将设​​置具有加密值的.AspNet.Cookies。在.NET成功解密请求中的cookie后,发生了什么验证?

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

我想了解什么是cookie身份验证的限制。

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

加密/解密基于机器密钥,可以显式设置在Web.config中或由ASP.NET自动生成。只有共享相同机器密钥的应用程序才能解密该cookie,这就是为什么保护机器密钥非常重要的原因。

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

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

目前尚不清楚您对此安排是否满意。如果您的目标是隔离在本地运行的两个网站,以便它们不共享Cookie,则您有几个选项。

  1. 您可以明确设置在各自的Web.config文件中每个站点不同机键。他们仍然会收到其他网站设置的任何Cookie,但他们将不能再解密它们,这基本上会导致它们被忽略。

  2. 您可以自定义auth cookie名称。您可以使用一个.Site1.Auth和另一个.Site2.Auth来代替使用默认的Cookie名称。然后,即使任一网站也会收到其他网站的Cookie,但它会简单地忽略它,因为它不是它的身份验证cookie。

但是,如果你打算依赖于这种行为的产生以及(即你真正想要日志到一个网站,你登录到其他的也一样),那么你就需要在两个站点的Web.config文件中明确将机器密钥设置为相同的值。此外,您需要将它们部署到同一个域,或者至少部署该域的子域。在子域的情况下,您需要将cookie域设置为两者的通配域.mydomain.com。然后,您可以在foo.mydomain.com处有一个,然后在bar.mydomain.com处有一个,他们都会看到Cookie,因为它已设置为.mydomain.com。如果您将其保留为默认设置,请在网站的实际域上进行设置,然后bar.mydomain.com将看不到由foo.mydomain.com设置的Cookie,因为该cookie只会明确设置为foo.mydomain.com

+0

感谢您的详细解答。 – AlejandroC

主要验证是加密和到期。如果应用共享加密上下文(例如机器密钥),则他们可以共享认证cookie(提供其他客户端共享规则,如域和路径得到满足)。因此,预计在同一台计算机上使用IIS Express localhost的两个应用默认会共享cookie。

过期也嵌入到加密值中,因此客户端不能篡改它。