【问题标题】:ASP.Net Membership ServicesASP.Net 会员服务
【发布时间】:2010-02-09 18:46:38
【问题描述】:

在我们的应用程序中,我们需要用户“模拟”不同的用户。把它想象成一个层次结构——鲍勃在一个层次结构中高于弗兰克。 Bob 已登录,他需要在系统中以 Frank 的身份在短时间内做一些事情。因此,我们为 Bob 提供了一个向他报告的用户列表,以及一个模拟链接。他单击此链接,然后在幕后将 Bob 注销,然后以 Frank 的身份登录。我还设置了一个会话变量,告诉我 Bob 确实是他们的用户。此外,Bob(现在扮演 Frank)在每个页面的顶部都有一个不错的小链接,上面写着“停止冒充”。

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

这工作得很好,直到我们遇到这样一种情况,如果会话(我认为 - 在这里感到困惑)被破坏(例如当我将新代码和 dll 复制到实时站点时),那么当 Bob 点击在“Stop Impersonation”上,他被重定向到默认页面,并且仍然以 Frank 的身份登录,但没有 Impersonation 会话变量。所以,现在 Bob 确实以 Frank 的身份登录,并且可以更改 Frank 的密码(以及其他内容)。

会话变量(模拟)如何被破坏,但我猜会话仍在徘徊,因为它不会让用户再次登录?

对于我们的系统工作方式来说,这是一个有点严重的错误(我敢肯定,我们的代码中的错误,而不是 .Net 中的错误)。有没有人对此有解决方案的建议?

我们正在使用 ASP.Net c#、aspnet 会员服务、.net 3.5、forms auth...不确定您还需要了解什么。

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

就像 Utaal 提到的那样,会员服务与 Session 是分开的,所以它的表单身份验证令牌仍然在浏览器中徘徊,但我的会话变量告诉我,这不是真正控制浏览器的用户不是没有了。

编辑:Sky,这是我为验证用户所做的工作。我不知道在这个流程中插入票证的位置:

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

那么,我可以在哪里输入工单对象并设置自己的信息?

【问题讨论】:

  • @matt,已更新。一旦你把头绕在它周围,它真的是小菜一碟。甚至是微不足道的......

标签: asp.net asp.net-membership


【解决方案1】:

马特, 使用表单票证上的UserData 槽来存储模拟信息。这就是它的用途。

那么您的信息将不会随着会话丢失。

如果您想要创建自己的票证的简单示例等,请查看this。您可能需要关注登录页面和 tickethelper 类。

【讨论】:

  • 根据您的建议,我尝试了这个,但您不能使用自己的验证并自己设置身份验证 cookie 并使用它。 “ticket”在那个时候是只读的。不过,感谢您的建议。
  • @matt,我不确定我是否关注你。根据我的经验,票证就是您所说的那样,尤其是当您执行自己的验证时,您有一个绝佳的机会在设置之前以任何您想要的方式构建票证。当您说“在那一点”时,您指的是何时/何地?我只是问,因为我希望看到您为您的问题找到一个优雅的解决方案。我已经让身份验证票做了一些愚蠢的人类把戏,请我吃午饭,然后在我出发之前洗碗。只是说...大声笑。
  • 天空,那我就糊涂了。请参阅我编辑的帖子,以便向您展示我正在使用的代码。我真的很想用这张票来做这件事,但我想我在这里错过了一些巨大的东西。
  • 谢谢天空。我会挖掘你链接到的代码(刚刚看到......也许我昨晚错过了 - 已经很长 6 个月了,还有 1 个月的时间)。
  • 天空,效果很好。我还有几个问题需要解决(关于 Identity 是一个 GenericIdentity 对象而不是 FormsIdentity 对象),但我已经完成了 95%。谢谢你一直陪着我。
【解决方案2】:

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

因此,当您的会话信息丢失(或会话过期)时,它实际上并没有闲置(除了用户电脑上的无效会话 cookie)。另一方面,Forms Authentication cookie 仍然有效(ASP.NET 对其进行解密并对请求的用户进行身份验证)。

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

【讨论】:

  • 谢谢尤塔尔。今晚有时间进行实验时,我会深入研究一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
相关资源
最近更新 更多