Aspnet 意外注销
Posted
技术标签:
【中文标题】Aspnet 意外注销【英文标题】:Aspnet unexpected logout 【发布时间】:2014-12-04 08:08:19 【问题描述】:我在一个使用 aspnet mvc 5 的项目中工作,我们遇到了一些问题,即在页面闲置 5 分钟后意外注销。
我的 web.config 中有这个:
<sessionState timeout="30"/>
<authentication mode="None"/>
您认为是什么导致了这个项目?
如果需要更多信息,请询问。
谢谢。
PS:我的 AuthenticationType 是 ApplicationCookie
PS2:将机器密钥添加到 web.config 并在几分钟后仍然注销:
<machineKey validationKey="string" decryptionKey="otherstring" validation="SHA1" decryption="AES" />
PS3:本地一切正常。
【问题讨论】:
你的应用程序池回收时间设置是什么?我假设您正在使用 InProc 会话模式。 我的应用程序托管在云服务中,我如何查看时间? 只是检查机器密钥是否进入了正确的位置(在 system.web 配置标签内) @Hatjhie 应用程序池空闲超时为 5 分钟 【参考方案1】:SessionState 超时与登录超时没有任何关系。用于登录的用户信息存储在加密的 cookie 中。根据您所说的身份验证类型,您需要更改 StartUp
类中的 ASP 身份设置。
app.UseCookieAuthentication(new CookieAuthenticationOptions
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
LogoutPath = new PathString("/Account/Logout"),
//Here is where you tell the system how long someone can stay logged in
//while being inactive.
ExpireTimeSpan = System.TimeSpan.FromMinutes(60),
SlidingExpiration = true,
CookieName = "LoginCookie"
);
编辑
鉴于您托管在云服务上,您很可能不会坐在单个服务器上,而是将您的应用程序部署到负载平衡器后面的多个服务器上,该负载平衡器将请求定向到多台机器。当您不能保证在单个服务器上时,您需要在 web.config 中定义MachineKey
。此密钥用于加密/解密LoginCookie
。如果MachineKey
没有定义,IIS 会补上一个。在多台服务器上时,在这种情况下,每台服务器都有自己的MachineKey
。由于密钥不同,他们无法解密彼此的登录 cookie,因此他们认为您没有登录。
<system.web>
<machineKey validationKey="BigLongNumber" decryptionKey="DifferentBigLongNumber"
validation="SHA1" decryption="AES" />
</system.web>
Machine Key Generator
【讨论】:
好的,现在由于某种原因在我刷新页面 LoginCookie 消失并注销用户几分钟后处于非活动状态。是什么原因造成的? @jony17 - 它适用于所有浏览器吗? 我会检查的。我主要在 chrome 上进行测试。 是的,它发生在 Firefox 和 chrome 上。 @汤米 我唯一能想到的就是检查您的服务器上的时间是否正确。 cookie 是基于时间的,如果服务器的时间不正确,它可能会认为 cookie 已过期。如果您将 ExpireTimeSpan 增加到疯狂的 1 年,您还会遇到同样的问题吗?【参考方案2】:请延长您的应用程序池超时时间。它将解决问题,因为从发布的配置中可以看出,您的网站正在使用默认的 Session InProc 模式。
一旦应用程序被回收,您存储在 w3wp 进程中的信息就会消失。
由于您使用的是云服务,您可能还想检查负载平衡的工作原理。
如果他们不使用粘性会话,最好将会话模式也更改为 StateServer 或 SQLMode。
希望对您有所帮助。让我知道结果。谢谢
【讨论】:
感谢您的回答。我尝试了 SQLMode,因为我没有延长应用程序池超时的权限,现在很好。一开始我遇到了一些困难,因为我在共享主机中并且对网络服务器的访问权限有限,所以我在本地数据库上运行脚本,将其备份并恢复到服务器数据库。以上是关于Aspnet 意外注销的主要内容,如果未能解决你的问题,请参考以下文章
ipad忘记icloud密码如何注销(ipad忘记密码怎么注销icloud账户)