Asp.net mvc ASP.NET MVC如何使用CookieAuthenticationMiddleware对Cookie进行内部验证

Asp.net mvc ASP.NET MVC如何使用CookieAuthenticationMiddleware对Cookie进行内部验证,asp.net-mvc,authentication,cookies,owin,Asp.net Mvc,Authentication,Cookies,Owin,我试图弄清楚ASP.NET如何在内部验证cookie是否允许用户访问应用程序 CookieAuthenticationMiddleware将使用加密值设置.AspNet.Cookies。在.NET对请求成功解密cookie后,会发生什么验证 如果我有一个在用户登录后设置身份验证Cookie的应用程序(#1),并且我创建了一个也在本地主机上运行的完整的新应用程序(#2),也就是使用CookieAuthentication在本地开发IISExpress。当我访问#2时,它将从#1读取cookie,并

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

CookieAuthenticationMiddleware将使用加密值设置.AspNet.Cookies。在.NET对请求成功解密cookie后,会发生什么验证

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


我试图了解cookie身份验证的限制。

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

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

实际上没有任何“验证”。cookie的加密密钥用于引用应该“登录”的用户。它的工作方式与会话非常相似,其中会话cookie保存了一个加密的会话id,服务器可以使用该id查找和恢复会话

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

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

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

现在还不清楚你对这个安排是否满意。如果您的目标是隔离本地运行的两个站点,这样它们就不会共享cookie,那么您有两个选择

  • 您可以在各自的Web.config文件中为每个站点显式设置不同的机器密钥。他们仍然会收到其他站点设置的任何cookie,但他们将不再能够对它们进行解密,这基本上会导致它们被忽略

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


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