我正在使用MVC 3开发一个使用标准表单身份验证的Web应用程序。它托管在共享主机上。问题是有时用户身份验证状态丢失。我完全没有例外。你有什么可能的原因吗?
身份验证与会话有关吗?我根本不使用Session对象。 我的印象是使用cookie的身份验证可以在负载平衡的环境中工作。我错了吗?
会话在20分钟时间之前丢失。
答案 0 :(得分:4)
这里有几件事情可以想到:
丢失的身份验证是否有任何模式?意思是,它总是在20分钟之后还是看起来很随意?
由于您使用的是共享主机,您是否在web.config中明确设置了机器密钥?如果不这样做并且它们被设置为自动生成,则如果应用程序是负载平衡的,则键将不同。因此,您在服务器A上进行身份验证,然后一些后续请求转到服务器B,您的应用程序将无法解码授权cookie并“将您踢出去”
在Web场中,您无法保证将处理哪个服务器 连续的请求。如果用户在一台服务器上进行了身份验证,那么 下一个请求转到另一个服务器,验证票据将 验证失败并要求用户重新进行身份验证。该 machineKey元素中的validationKey和decryptionKey属性 用于表单身份验证的散列和加密 票。这些属性的默认值是 AutoGenerate.IsolateApps。每个都自动生成密钥 应用程序,它们在每台服务器上都不同。因此, 在一台计算机上加密的身份验证票证不能 在Web场中的另一台计算机上解密并验证 同一Web服务器上的另一个应用程序。要解决这个问题, validationKey和decryptionKey值必须完全相同 Web场中的计算机。
答案 1 :(得分:0)
会话暂停,如果你通过它,你的会话(和身份验证)将被破坏。
你可以从web.config
增加超时,或者这就是我去的方式,你可以制作一个你每隔几分钟用AJAX ping一次的虚拟页面。后者的优点是,当用户关闭浏览器时,您的会话仍将及时终止,而不是使用资源停留半小时并阻止Application_OnExit
运行。