如何同步窗体身份验证Cookie和ASP.NET会话的生存期?

63lcw9qa  于 2022-11-19  发布在  .NET
关注(0)|答案(3)|浏览(102)

我正在构建一个使用FormsAuthentication和标准会话机制的ASP.NET网站,其配置如下:

<authentication mode="Forms">
    <forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/>
</authentication>
...
<sessionState timeout="20" cookieless="UseCookies" />

似乎身份验证Cookie的生存期不等于用户会话的生存期。
1.用户注销时会话终止,
1.会话在用户注销之前不会终止。
是否有方法自定义FormsAuthentication或\和会话状态机制以达到这些目标?

8yoxcaq7

8yoxcaq71#

这个问题我已经听过很多次了,我的回答通常是“你为什么想要这个?"。一个不需要另一个,它们的有效期应该使用不同的标准来确定。
会话状态不需要用户登录。应用甚至不需要使用身份验证来使用会话状态。您可以有一个Web应用,其中用户甚至在登录之前就已经在使用会话状态,并且在注销后仍然在使用它。这里的“会话”是指客户端(Web浏览器)连接到站点,在几个页面之间跳转,然后离开。用户是否登录无关紧要。如果关闭浏览器,打开一个新浏览器,然后返回站点,一个新的会话被创建。但是服务器不知道您关闭了旧的浏览器窗口,所以原来的会话仍然存在。为了可伸缩性(主要是内存)的目的,我们终止了我们的会话并释放了它的内存和会话跟踪资源。如果客户端花了太长的时间来发出一个新的请求,新的请求将创建一个新的会话。
另一方面,您可以使用身份验证而完全不使用会话状态。我通常在启动应用程序时禁用会话状态和视图状态,只有在真正需要时才逐页启用它们(或者对于视图状态是逐控件启用)。
阶段作业到期时间应该由每个阶段作业使用的内存、Web服务器上可用的内存、并行使用者的数目,以及其他扩充性需求来决定。它通常介于几分钟到一小时之间。
身份验证作为cookie保存在客户端上,基本上不消耗服务器的任何资源。从可伸缩性Angular 来看,登录过期时间通常比会话过期时间长。实际上,用户可以无限期地保持登录状态。当身份验证过期时间保持较短时,通常是出于安全考虑如果你离开你的电脑15分钟,你不希望你的银行网站帐户被其他人使用,对吧?你可以登录Gmail或Facebook,选择“记住我”,几天后返回,你仍然是登录的。但当然这将是一个新的会话,因为任何Web应用程序都不应该将会话数据保留几天。
现在,我看到很多人使用相同的时间长度进行身份验证和会话过期。()或清除()的会话。但是他们忘记了您仍然需要管理用户仍处于登录状态但会话已过期的情况(在下一次请求时创建新的 * 空 * 会话),或者当用户的身份验证过期但会话未过期时(要求他们再次登录,但携带着旧的未过期会话,可能带有其他用户的敏感数据)。处理这些情况非常重要,无论您最终为应用程序选择了什么样的超时。

ovfsdjhp

ovfsdjhp2#

没有内置的机制,因为实际情况是您希望用户保持登录的时间比您希望他们的会话保持的时间长。此外,会话并不意味着是有保证的存储,您应该避免对会话中的数据的任何依赖。
当验证Cookie过期时,服务器上不会发生任何事情。没有跟踪状态。
您可以有一个'logout'链接,在处理程序Abandon中有会话和来自FormsAuthentication的SignOut,但是没有任何东西强制用户从网站注销。
有些人喜欢Session,但大多数人讨厌它,因为它的使用被滥用。主要原因是Session的过度使用往往是性能低下的服务器的原因,不正确的Session使用可以创建网站,将无法扩展。
如果可以,请避免使用Session,如果必须使用Session,请遵循MSDN文章Improving ASP.NET Performance中的建议。另外,请查看Understanding session state modes + FAQ,特别是问:为什么没有触发Session_End?

vuktfyat

vuktfyat3#

我有时问自己这个问题的原因是为了防止访问“过期”的会话对象。当会话在登录过期之前过期,并且用户请求一个使用会话数据的页面时,会发生令人讨厌的空引用异常。
您可能会发现这个article很有帮助。它讨论了几种检测过期会话并通知用户的解决方案。

相关问题