代码之家  ›  专栏  ›  技术社区  ›  Matt Dawdy

ASP.NET成员资格服务

  •  0
  • Matt Dawdy  · 技术社区  · 15 年前

    在我们的应用程序中,我们需要一个用户“模拟”另一个用户。把它看成是一种等级制度——鲍勃在等级制度中高于弗兰克。Bob已经登录,他需要像Frank一样在系统中做短时间的事情。所以,我们给了Bob一个向他报告的用户列表和一个模拟链接。他点击了这个链接,在幕后,我注销了Bob,并以Frank的身份登录。我还设置了一个会话变量,告诉我Bob实际上是用户。此外,Bob(现在扮演Frank)在每个页面的顶部都有一个不错的小链接,上面写着“停止模仿”。

    此外,当Bob冒充Frank时,Bob被限制做一些事情,例如更改Frank的密码。

    这非常有效,直到我们遇到这样一种情况:如果会话(我想——这里有点困惑)被破坏(例如,当我将新代码和DLL复制到活动站点时),那么当Bob单击“停止模拟”时,他将被重定向到默认页,并且仍然以Frank身份登录,但没有模拟会话var有可能。所以,现在Bob真的以Frank的身份登录,并且可以更改Frank的密码(除其他外)。

    会话变量(模拟)是如何被销毁的,但我猜会话仍在运行,因为它不会让用户再次登录?

    对于我们的系统是如何工作的,这是一个有点严重的bug(我敢肯定,在我们的代码中是bug,而不是在.NET中)。有人对此有什么建议吗?

    我们使用的是ASP.NET C,ASPNET成员服务,.NET 3.5,表单验证…不确定还需要知道什么。

    编辑:更新信息。例如,当“某物”发生时,当我重新编译一些DLL并将它们复制到Web服务器时,会话就会被转储。或者,更确切地说,会话中的变量被转储。会话ID保持不变。我确实要检查session.isNewSession,它会返回true,即使ID与以前相同。

    正如Utaal所提到的,会员服务与会话是分开的,所以表单认证令牌仍然在浏览器中存在,但是我的会话变量告诉我,控制浏览器的用户已经不在那里了。

    编辑:天空,这是我要做的验证用户身份。我不知道在哪里可以在这个流程中插入一张票:

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

    那么,我在哪里可以滑入一个票据对象并设置我自己的信息呢?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Community CDub    8 年前

    Matt 使用 UserData 窗体票证上存储模拟信息的槽。这就是它的目的。

    这样,您的信息就不会在会话中丢失。

    如果您想要创建自己的票的简单示例,除其他外,请检查 this . 您可能需要关注登录页面和TickelPer类。

        2
  •  2
  •   Utaal    15 年前

    我认为您的问题是因为表单身份验证和会话是两个不同的东西,并且没有相互连接:它们(通常)都使用cookie,但是表单身份验证将加密的登录用户直接存储在cookie中,而会话在进程中存储信息(即使您可以更改此行为),并使用cook带有会话标识符的IE来检索它。

    因此,当您的会话信息丢失(或会话过期)时,它实际上不会一直存在(除了用户PC上的无效会话cookie)。另一方面,表单身份验证cookie仍然有效(ASP.NET对其进行解密,并对用户的请求进行身份验证)。

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