【发布时间】:2017-05-05 16:02:54
【问题描述】:
我的 ASP.NET MVC 网站在我认为不应该登录的情况下保持登录状态。
我的网络服务器是 IIS 7.5,应用程序池是 V4.0 集成,空闲超时设置为 20 分钟。
登录时,网站会保存一个身份验证 cookie,该 cookie 在“浏览会话结束时”到期(持久性设置为 false)。
如果我关闭浏览器(Chrome 或 FF),然后在服务器上的 IIS 上回收(或停止/启动)应用程序池,然后重新打开浏览器,那么会话 cookie 似乎仍然有效。
我知道 Firefox 和 Chrome 在您关闭浏览器时不会删除会话 cookie(因此您可以从上次中断的地方开始),但肯定会话不再存在于服务器上,因为应用程序池已回收?我没有将会话数据保存到数据库,也没有在我的 web.config 中设置机器 ID。
为什么这个 cookie 仍然有效?
编辑 1 - cookie 是如何设置的
Cookie 身份验证选项由 ConfigureAuth 设置(从我的 OWIN 启动类中的 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,所以我不确定这是否正确。
【问题讨论】:
-
当你回收内存被清除,所以技术上这是不可能的;)你确定你回收的是正确的应用程序(发生在我身上,愚蠢的我)
-
@Ravenix 是的,肯定会回收正确的应用程序池。这就是为什么我对如何保持登录状态感到困惑的原因。
-
这只能意味着会话管理不在内存中。您是否绝对 100% 确定会话已保存在内存中?
-
应用程序池使用默认设置(或多或少)当然没有改变内存管理。就 IIS 本身而言 - 我没有参与安装,但它可能是标准设置。我 99% 的会话都保存在内存中。我会尝试确认并消除 1% 的疑问。
-
确认... 100% 来自马口(设置整个服务器的人)
标签: c# asp.net asp.net-mvc iis cookies