如何同步表单身份验证 cookie 和 Asp.Net 会话的生命周期?
Posted
技术标签:
【中文标题】如何同步表单身份验证 cookie 和 Asp.Net 会话的生命周期?【英文标题】:How to synchronize lifetime of forms authentication cookie and Asp.Net Session? 【发布时间】:2010-10-27 11:37:18 【问题描述】:我正在构建一个使用FormsAuthentication
和标准会话机制的 ASP.NET 网站,其配置如下:
<authentication mode="Forms">
<forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/>
</authentication>
...
<sessionState timeout="20" cookieless="UseCookies" />
似乎身份验证cookie的生命周期不等于用户会话的生命周期。 所以 ASP.NET 不保证这一点
用户注销时会话终止,
会话不会在用户注销之前终止。
有没有办法自定义FormsAuthentication
或\和会话状态机制来实现这些目标?
【问题讨论】:
【参考方案1】:我多次听到这个问题,我的回答通常是“你为什么要这个?”。一个不需要另一个,它们的到期时间应该使用不同的标准来确定。
会话状态不需要用户登录。应用甚至不需要使用身份验证来使用会话状态。您可以拥有一个 Web 应用程序,其中用户甚至在登录之前就已经在使用会话状态,并且在注销后仍然使用它。这里的“会话”是指客户端(Web 浏览器)连接到站点,跳过几页然后离开。用户是否登录无关紧要。如果您关闭浏览器,打开一个新浏览器,然后返回该站点,则会创建一个新会话。但是服务器不知道您关闭了旧浏览器窗口,因此原始会话仍然存在。出于可扩展性(主要是内存)的目的,我们使会话过期并释放其内存和会话跟踪资源。如果客户端发出新请求的时间过长,则新请求将创建一个新会话。
另一方面,您可以使用身份验证而不使用会话状态。我通常在禁用会话状态和视图状态的情况下启动我的应用程序,并且仅在确实需要时并逐页启用它们(或视图状态的逐个控制)。
会话过期时间应由每个会话使用的内存、Web 服务器上的可用内存、并发用户数和其他可伸缩性需求决定。它通常在几分钟到一个小时的范围内。
身份验证作为cookie保存在客户端,基本上不消耗服务器的任何资源。可扩展性方面,登录过期通常比会话过期长。事实上,用户可以无限期地保持登录状态。当身份验证过期时间保持较短时,通常是出于安全原因。如果您离开计算机 15 分钟,您不希望其他人可以使用您的银行网站帐户,对吗?您可以登录 gmail 或 facebook 并选择“记住我”并在几天后返回,您仍然仍然登录。但这当然是一个新会话,因为任何网络应用程序都不应该保留几天的会话数据。
现在,我看到很多人使用相同的时间长度进行身份验证和会话到期。当用户注销时,许多人还会 Abandon() 或 Clear() 他们的会话。但是他们忘记了您仍然需要管理用户仍然登录但会话已过期(这会在下一个请求时创建一个新的 empty 会话)的情况,或者当用户的身份验证已过期,但他们的会话未过期(要求他们重新登录,但携带旧的未过期会话,可能带有其他用户的敏感数据)。无论您最终为应用程序选择什么超时,处理这些情况都非常重要。
【讨论】:
【参考方案2】:没有内置机制,因为现实情况是您希望用户保持登录的时间比您希望保持他们会话的时间更长。此外,会话并不意味着保证存储,您应该避免对会话中的数据的任何依赖。
当身份验证 cookie 过期时,服务器上不会发生任何事情。没有跟踪状态。
您可以在处理程序Abandon
和来自 FormsAuthentication 的会话和SignOut
中拥有一个“注销”链接,但没有任何东西可以强制用户从网站注销。
有些人喜欢 Session,但大多数人讨厌或讨厌它,因为它的使用被滥用了。主要原因是 Session 过度使用往往是服务器性能不佳的原因,而不正确的 Session 使用可能会创建无法扩展的网站。
尽可能避免使用 Session,如果必须使用,请遵守 MSDN 文章 Improving ASP.NET Performance 中的建议。还请查看Understanding session state modes + FAQ,尤其是问:为什么 Session_End 没有被解雇?
【讨论】:
【参考方案3】:我有时问自己这个问题的原因是为了防止访问“过期”的会话对象。 当会话在登录到期之前到期,并且用户请求使用会话中数据的页面时,会发生令人讨厌的空引用异常。
您可能会发现此article 很有帮助。它讨论了几种检测过期会话并通知用户的解决方案。
【讨论】:
以上是关于如何同步表单身份验证 cookie 和 Asp.Net 会话的生命周期?的主要内容,如果未能解决你的问题,请参考以下文章
(Monaca,Cordova)带有表单身份验证(Cookie)的 Web API 请求不起作用
在 OWIN 托管的 SignalR 实现中接受 ASP.NET 表单身份验证 cookie?