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

时间:2017-07-14 16:14:43

标签: asp.net-mvc authentication cookies owin

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

CookieAuthenticationMiddleware将使用加密值设置.AspNet.Cookies。 .NET成功解密请求后的cookie,然后会进行哪些验证?

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

我正在尝试了解Cookie身份验证的限制。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

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

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

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

  2. 您可以自定义身份验证Cookie名称。您可以制作一个.Site1.Auth而另一个.Site2.Auth,而不是使用默认Cookie名称。然后,即使任一站点也会收到其他站点的cookie,它也会忽略它,因为它不是它的auth cookie。

  3. 但是,如果您打算在生产中依赖此行为(即您实际上希望登录到一个站点以便将您登录到另一个站点中),那么您将会需要在两个站点的Web.config文件中将机器密钥显式设置为相同的值。此外,您需要将它们部署在同一个域上,或至少部署在该域的子域中。对于子域,您需要将cookie域设置为两者的通配符域.mydomain.com。然后,您可以在foo.mydomain.combar.mydomain.com处拥有一个,并且他们都会看到Cookie,因为它是在.mydomain.com上设置的。如果您将其保留为默认设置,请在网站的实际域中设置,bar.mydomain.com无法看到foo.mydomain.com设置的Cookie,因为该Cookie只会为foo.mydomain.com显式设置。< / p>