当用户登录我的asp.net网站(通过FormsAuthentication)时,我会在当前会话中存储一些关于它们的信息,例如他们的UserId,FirstName以及我在各种网页中经常需要的其他非常基本的变量。
问题是即使会话超时设置为比FormsAuthentication超时更长,我也注意到有时当前会话被重置(即session = null)。
1)我不明白为什么会这样。有任何想法吗?
2)当发生这种情况时,用户仍然登录(FormsAuthentication尚未超时),但他们当前的会话不再包含任何数据。我想要做的是当当前会话超时时,他们被要求再次登录。为此,我需要检测会话超时,并在发生时将其注销。如何才能做到这一点?
3)这似乎有点矫枉过正。我不能直接在FormsAuthentication中存储我在会话中存储的任何内容(UserId,FirstName等)吗?如果是这样,怎么样?这样,无论当前会话如何(在这种情况下都不会再使用),我仍然可以访问这些值。你觉得这个逻辑有什么问题吗?如果没有,怎么办呢?
答案 0 :(得分:1)
我们面临同样的问题,原因是,FormsAuthentication和Session是两回事。 FormsAuth设置cookie并且cookie随每个请求一起传输,但是如果IIS工作进程回收或崩溃并恢复或IIS重新启动,则可能会破坏您的会话。您对FormsAuth的cookie仍然有效,但您的会话不会。这就是为什么OnAuthenticate你应该只是在会话值不存在时重新创建会话。这里需要一个if语句开销。
这将允许您在未初始化会话值的情况下启动它们,如果会话可能被销毁,您应该检查并初始化此代码。
答案 1 :(得分:0)
我认为UserID 实际上是存储在Membership系统中?你不能从HttpContext.Current.User
获得足够的信息吗?
您可以使用“配置文件”属性存储其他信息。有关详细信息,请参阅this page。
答案 2 :(得分:0)
您已经开始进入一个共同的陷阱,将基于asp.net提供程序的功能与它们旨在替换的功能(会话)混合在一起。洛尔。
使用配置文件提供程序存储有关用户的附带数据。在配置中定义字段似乎更多的工作,但它通过不在应用程序中分散任意字符串键来减少代码气味。还有其他好处,但使用配置文件提供程序将正确解决您的问题。