应用程序池回收后,会话cookie仍会进行身份验证

时间:2016-12-20 12:24:13

标签: c# asp.net asp.net-mvc iis cookies

当我不相信它们时,我的ASP.NET MVC网站仍然保持登录状态。

我的网络服务器是IIS 7.5,应用程序池是V4.0集成,空闲超时设置为20分钟。

登录时,网站会保存一个过期的Cookie,“当浏览会话结束时”(持久性设置为false)。

如果我关闭浏览器(Chrome或FF),然后在服务器上的IIS上回收(或停止/启动)应用程序池,然后重新打开浏览器,那么会话cookie似乎仍然有效。

我知道当您关闭浏览器时Firefox和Chrome不会删除会话cookie(因此您可以从上次停止的地方开始),但由于应用程序池已经回收,因此服务器上的会话肯定不存在?我没有将会话数据保存到数据库,也没有在我的web.config中设置机器ID。

为什么这个cookie仍然有效?

编辑1 - 如何设置cookie

Cookie auth选项由ConfigureAuth设置(从我的OWIN Startup类中的Configuration方法调用)。 Cookie选项:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    CookieName = "MyCookieName",
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    SlidingExpiration = true,
    ExpireTimeSpan = TimeSpan.FromDays(7) // this only applies if persistent is true!
});

用户已使用

登录
await SignInManager.SignInAsync(user, isPersistent, rememberBrowser);

isPersistent是从登录表单上的“记住我”复选框设置的。如果选中此项,则cookie将使用CookieAuthenticationOptions中的ExpireTimeSpan到期。如果没有选中,那么cookie将在“浏览会话结束时”到期,这就是我的问题所在。

rememberBrowser设置为false - 这用于2FA,我的实现中没有使用它。

SignInAsync是默认实现,调用:

AuthenticationManager.SignIn(new AuthenticationProperties()
    {
      IsPersistent = isPersistent
    }, userIdentity);

...这也是默认实现。

AuthenticationManager负责设置实际的Cookie(我相信)。

编辑2 - machineKey?

进一步研究后,机器密钥可能存储在cookie中,允许它跨池循环进行身份验证。我没有在web.config中定义machineKey,所以我不确定这是否正确。

1 个答案:

答案 0 :(得分:0)

IIS使用在应用程序池回收期间保持相同的计算机密钥来识别应用程序。它存储在身份验证cookie中,以便可以跨应用程序池回收对用户进行身份验证。