2

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

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

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

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

4

2 回答 2

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");
}
于 2012-08-23T09:51:55.860 回答
0

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

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

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

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

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

于 2012-08-23T09:56:41.123 回答