当我不相信它们时,我的ASP.NET MVC网站仍然保持登录状态。
我的网络服务器是IIS 7.5,应用程序池是V4.0集成,空闲超时设置为20分钟。
登录时,网站会保存一个过期的Cookie,“当浏览会话结束时”(持久性设置为false)。
如果我关闭浏览器(Chrome或FF),然后在服务器上的IIS上回收(或停止/启动)应用程序池,然后重新打开浏览器,那么会话cookie似乎仍然有效。
我知道当您关闭浏览器时Firefox和Chrome不会删除会话cookie(因此您可以从上次停止的地方开始),但由于应用程序池已经回收,因此服务器上的会话肯定不存在?我没有将会话数据保存到数据库,也没有在我的web.config中设置机器ID。
为什么这个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(我相信)。
进一步研究后,机器密钥可能存储在cookie中,允许它跨池循环进行身份验证。我没有在web.config中定义machineKey,所以我不确定这是否正确。
答案 0 :(得分:0)
IIS使用在应用程序池回收期间保持相同的计算机密钥来识别应用程序。它存储在身份验证cookie中,以便可以跨应用程序池回收对用户进行身份验证。