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