放弃会议没有全部清除

时间:2012-08-23 09:46:05

标签: c# asp.net session

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

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

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

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

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:0)

问题的核心是,通常对于一个 asp web应用程序,每个物理用户的浏览器只有一个会话(*)。如果没有对站点/框架/服务器代码结构进行一些非常严格的修改,您将无法创建和保留几个并行的sesisons。即使您的页面和控件提供的“.Session”哈希映射始终显示相同的键/值..

您的网络应用的某些部分可能会使用不同的密钥,从而模拟不相交的“图层”或“模块”,但这只是一个存储空间..

因此,如果你打电话给Session-Abandon,你会失去所有 - 因为它只有一个会话...

你唯一能做的就是手动选择性地清除正确的条目,比如Rolice在这里平行回答:)

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