2010-02-09 45 views
0

在我们的应用程序中,我们需要用户“冒充”不同的用户。把它看成是一个层次结构 - 鲍勃在层次结构中高于弗兰克。 Bob已登录,他需要在系统中短时间内处理Frank的内容。因此,我们向Bob提供了向他汇报的用户列表以及模拟链接。他点击这个链接,在幕后,我将Bob注销,并以弗兰克登录。我还设置了一个会话变量,告诉我真的Bob是谁,是谁的用户。另外,鲍勃(现在扮演弗兰克)在每页顶部都有一个很好的小链接,上面写着“停止模仿”。另外,当鲍勃扮演弗兰克时,鲍勃被限制做某些事情,比如改变弗兰克的密码。ASP.Net会员服务

这很好,直到我们遇到了一个情况,如果会话(我认为 - 在这里变得困惑)被破坏(比如当我将新代码和dll复制到活动站点时),那么当Bob点击“停止模拟”他被重定向到默认页面,并且仍然以Frank身份登录,但没有模拟会话变量。所以,现在Bob真的以Frank身份登录,并且可以更改Frank的密码(等等)。

是什么让一个会话变量(模拟)被摧毁,但我猜会话还在闲逛,因为它不会使用户再次登录?

这是我们的系统是如何工作的有些严重的错误(在我们的代码错误,我敢肯定,没有.NET)。有没有人对此有任何解决方案的建议?

我们正在使用ASP.Net C#,ASPNET会员服务,.NET 3.5,窗体身份验证...不知道你需要知道什么。

编辑:更新的信息。看起来像什么时候发生了“某些事情”,例如,当我重新编译一些dll并将它们复制到网络服务器时,会话被转储。或者,相反,会话中的变量会被抛弃。会话ID保持不变。我确实需要检查Session.IsNewSession,它会返回true,即使id与以前相同。

就像Utaal提到的,Membership Services与Session是分开的,所以它的表单auth token仍然在浏览器中,但是我的session变量告诉我这不是真正控制浏览器的用户isn'再也不存在了。

编辑:天空,这里是我正在做什么来验证用户。我想不通,我会插入一张票到这个流程:

if (Membership.ValidateUser(txtUserName.Text, txtPassword.Text)) 
    FormsAuthentication.SetAuthCookie(txtUserName.Text, false); 

所以,我在哪里可以滑在票据对象,并设置自己的信息?

+0

@matt,已更新。一旦你将头部缠绕在身上,它确实是一块蛋糕。琐碎甚至... – 2010-02-23 05:11:20

回答

3

Matt, 使用表格传票上的UserData插槽来存储模拟信息。这就是它的目的。

然后你的信息不会在会话中丢失。

如果您想制作自己的机票的简单示例,请参阅this。您可能需要关注登录页面和tickethelper类。

+0

根据你的建议,我尝试了这一点,但你不能使用你自己的验证并自己设置auth cookie并使用它。 “票证”仅在此时读取。还是)感谢你的建议。 – 2010-02-22 16:17:16

+0

@matt,我不知道我跟着你。根据我的经验,票据就是您所说的,特别是当您执行自己的验证时,您有完美的机会在设置票据之前以任何方式构建票据。当你说“在那个时候”你准确地指什么时候/在哪里?我只问,因为我希望看到你得到一个优雅的解决你的问题。我已经让auth门票做了一些愚蠢的伎俩,给我买了午餐,然后把它们清理出去,然后洗碗。只是说...哈哈。 – 2010-02-22 19:55:40

+0

天空,然后我很困惑。看到我编辑的帖子,我可以告诉你我正在使用的代码。我真的很想用这张票来做这件事,但我想我在这里错过了很多东西。 – 2010-02-23 05:03:52

2

我认为你的问题是由于窗体身份验证和会话是两个不同的东西,而不是相互连接的事实:他们两个(通常情况下)的使用Cookie,但窗体身份验证存储加密直接在cookie中同时登录的用户会话在进程中存储信息(即使您可以更改此行为)并使用具有会话标识符的cookie来检索它。

所以,当您的会话信息会丢失(或会话过期),它是不是真的还在闲逛(除了在用户的PC无效会话cookie)。另一方面,表单身份验证Cookie仍然有效(ASP.NET会对其进行解密并根据请求对用户进行身份验证)。

一个可能的解决方案是检测创建新会话(使用HttpSessionState.IsNewSession MSDN)并注销用户(使用FormsAuthentication)。然后,您可以将用户重定向到登录页面。

+0

感谢Utaal。当我有时间做实验时,我会在今晚深入一点。 – 2010-02-09 20:16:58