【问题标题】:Asp.net Session times out before FormsAuthenticationAsp.net 会话在 FormsAuthentication 之前超时
【发布时间】:2009-09-03 12:24:21
【问题描述】:

当用户登录我的 asp.net 网站时(通过 FormsAuthentication),我将一些关于他们的信息存储在当前会话中,例如他们的 UserId、FirstName 以及我在各种网页中经常需要的其他非常基本的变量。

问题是即使会话超时设置为长于 FormsAuthentication 超时,我注意到有时当前会话会被重置(即 session=null)。

1) 我不明白为什么会这样。有任何想法吗?

2) 发生这种情况时,用户仍处于登录状态(FormsAuthentication 尚未超时),但他们当前的会话不再包含任何数据。我想做的是,当当前会话超时时,他们被要求再次登录。为此,我需要检测会话超时,并在发生时将其注销。如何才能做到这一点?

3) 这似乎有点矫枉过正。我不能直接在 FormsAuthentication 中存储我在会话中存储的任何内容(UserId、FirstName 等)吗?如果是这样,如何?这样,无论当前会话如何(在这种情况下将不再使用),我都可以在它们仍然登录时访问这些值。你觉得这个逻辑有什么问题吗?如果没有,怎么办?

【问题讨论】:

标签: asp.net session


【解决方案1】:

我们遇到了同样的问题,原因是 FormsAuthentication 和 Session 是两个不同的东西。 FormsAuth 设置 cookie 并且 cookie 随每个请求一起传输,但是如果 IIS 工作进程回收或崩溃并恢复或 IIS 重新启动,您的 Session 可能会被破坏。您的 FormsAuth cookie 仍然有效,但您的会话不会。这就是为什么 OnAuthenticate 如果会话值不存在,您应该简单地重新创建会话。这里需要一个 if 语句开销。

看看这个FormsAuthenticationModule

如果会话值未初始化,这将允许您初始化会话值,您应该在此代码中检查并初始化,以防会话可能被破坏。

【讨论】:

    【解决方案2】:

    我认为用户 ID 实际上存储在会员系统中?你不能从HttpContext.Current.User得到足够的信息吗?

    您可以使用配置文件属性来存储其他信息。请参阅this page 了解更多信息。

    【讨论】:

      【解决方案3】:

      您遇到了一个常见的陷阱,将基于 asp.net 提供程序的功能与它们旨在替换的功能(会话)混合在一起。哈哈。

      使用配置文件提供程序存储有关用户的附带数据位。在配置中定义字段似乎需要做更多的工作,但它通过不让任意字符串键分散在您的应用程序中来减少代码异味。还有其他好处,但使用配置文件提供程序将正确解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-04
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2013-09-18
        • 2014-07-18
        相关资源
        最近更新 更多