【问题标题】:Abandon Session Without Clearing All放弃会话而不清除所有
【发布时间】:2012-08-23 09:46:05
【问题描述】:

概述: 我创建了一个具有客户区域和管理区域的系统。两个区域都有不同的登录页面。用户可以在管理区域以 User A 身份登录,同时在客户区域以 User B 身份登录。

当用户从客户或管理区域注销时,Session.Abandon() 会被调用,它会删除客户和管理区域中的会话我不希望发生这种情况

问题:我可以在退出时放弃会话而不影响其他区域的会话吗? (即:当我从客户区域注销时,我应该在管理区域保持登录状态)

更新:我知道Session.Clear() 可以解决这个问题,但我担心它可能带来的安全风险。

【问题讨论】:

  • 实现这两个独立的网站会更简单吗?
  • 不!放弃会话导致清除所有会话。您可以使用 session.remove("Keyname") 删除特定会话
  • 您是否在两个区域使用相同的会话?尝试使用两个不同的会话
  • 他们是如何登录的?您可能不使用 FormsAuthentication,我看不出您如何在同一个应用程序中登录两次...这是自定义解决方案吗?
  • @RichardEv :它会更简单。但事实并非如此,将其分成两个不同的网站需要做很多工作。

标签: c# asp.net session


【解决方案1】:

编写您的函数来检查会话的客户 ID 是否 > 0、用户名不为空且 ip 等于远程 ADDR。

将 customer_id、customer_username 和 IP(出于安全考虑)存储在会话中并仅清除它们。 当您调用您的函数时,它将返回该用户未作为客户签名。

同样适用于管理员。

没有必要销毁(放弃)会话,使其保持活动状态并存储其他信息。

public bool IsLoggedIn()
{
    // You will have to check for the keys, if they are present in the Session container, first.

    if(!Session.Containts("customer_id")
            || !Session.Contains("customer_username")
            || !Session.Contains("customer_ip"))
        return false;

    return Session["customer_id"] > 0
        && String.IsNullOrEmpty(Session["customer_username"])
        && Session["customer_ip"] = Request.ServerVariables("REMOTE_ADDR")
}

public void LogOut()
{
    Session.Remove("customer_id");
    Session.Remove("customer_username");
    Session.Remove("customer_ip");
}

【讨论】:

    【解决方案2】:

    问题的核心在于,对于一个 asp Web 应用程序,每个物理用户的浏览器通常只有一个会话 (*)。如果不对站点/框架/服务器代码结构进行一些真正认真的修改,您将无法创建和维护多个并行会话。即使是页面和控件提供的“.Session”哈希图也总是显示相同的键/值..

    您的网络应用程序的某些部分可能使用不同的键,从而模拟不相交的“层”或“模块”,但这仍然只是一个存储..

    因此,如果您调用 Session-Abandon,您将失去一切 - 因为它只有一个会话..

    您唯一能做的就是手动有选择地清除正确的条目,就像 Rolice 在这里并行回答的那样:)

    (*) 实际上,当您执行 Session-Abandon 时,您并没有删除/销毁会话。仍然只有一个会话。它刚刚忘记了所有数据,现在它是“空的”= 所以,就像新的一样。好吧,它可能会删除旧的 cookie,我不记得了,但它们会在下一页呈现时立即用新的新密钥重新创建,所以......而是立即。

    【讨论】:

    • 如果我有选择地删除会话而不是放弃它,是否存在任何潜在的安全风险?
    • 好吧,您忘记清除/删除的所有内容都会保留在那里,直到会话真正结束。因此,风险仅取决于您在会话中保留的内容以及您是否允许在您的站点上添加和运行第 3 方代码模块。 Session 是一个全局的,因此您当前显示的网页上的任何模块都可以访问它。这同样适用于 ViewState 和 ControlState 以及 Web 引擎中存在的其他状态包。但是,请注意会话保留在服务器上,只有会话密钥在 cookie 中,因此只有服务器端代码模块适用。你的服务器。 Google-stats 等不会看到它。
    • 但这适用于会话,适用于 ViewState/ControlState 和类似的状态包。它们被序列化并作为隐藏的表单字段嵌入到页面的 HTML 代码中——因此它们是完全不安全的,任何可以读取 HTML 的代码也可能读取放入其中的数据。这就是为什么它被称为 ViewState - “与视图一起保存的数据”。如果您想知道您的状态包的行为方式,您必须自己或在您的框架文档中进行检查。 ViewState/ControlState 存在于基础 ASP.NET 中,在 MVC 中可能有不同的命名。
    • 注意:即使忘记清除某些东西,会话也相对安全,只要您信任服务器上的代码即可。我假设您使用的是众所周知的服务器端模块。只有当您忘记清除某些敏感键时,有关 ViewState/ControlState/etc 的警告才适用。如果您确定已删除所有内容,则它是安全的。或者至少和它一样安全,因为如果你将敏感数据保存在 ViewState 中,那么邪恶的人可能已经阅读了它们 :wink: 我在开玩笑,但要小心使用它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2015-02-10
    • 2012-02-12
    • 2011-03-05
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多