概述 我创建了一个具有Customer区域和Admin区域的系统。这两个区域都有不同的登录页面。用户可以在管理区域中以用户A 身份登录,同时在客户区域中以用户B 身份登录。
当用户从“客户”或“管理”区域注销时,会调用Session.Abandon()
并删除客户和管理区域中的会话我不希望发生
问题:我可以在不影响其他区域会话的情况下放弃注销会话吗? (即:当我从客户区域注销时,我应该保持在管理区域中登录)
更新:我知道Session.Clear()
可以解决此问题,但我担心它可能带来的安全风险。
答案 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,我不记得了,但是它们将在下一页渲染时立即用新的新密钥重新创建,所以......相当立即。