2009-09-03 110 views
0

当用户在我的asp.net网站(通过FormsAuthentication)登录时,我在当前会话中存储了一些关于它们的信息,例如他们的UserId,FirstName和其他非常基本的变量经常在各种网页上。Asp.Net会话在FormsAuthentication之前超时

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

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

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

3)这似乎有点矫枉过正。我不能直接在FormsAuthentication中存储会话中存储的任何内容(UserId,FirstName等)吗?如果是这样,怎么样?通过这种方式,无论当前会话如何,我都可以访问这些值(但在此情况下不再使用)。你看到这个逻辑有什么问题吗?如果没有,那怎么办?

+0

Dupe? http://stackoverflow.com/questions/648992/session-timeout-in-asp-net – 2009-09-03 12:29:15

+0

杜佩? http://stackoverflow.com/questions/316172/session-timeout-asp-net – 2009-09-03 12:30:24

+0

你使用HttpContext.Current.User获取信息?? – 2009-09-03 12:35:14

回答

0

我以为UserID 实际上存储在Membership系统中吗?你不能从HttpContext.Current.User获得足够的信息吗?

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

1

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

检查出FormsAuthenticationModule

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

0

你已经将头脑放到了一个共同的陷阱中,将基于asp.net提供者的功能与他们设计要取代的功能(会话)混合在一起。大声笑。

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