在 ASP.NET 中清除会话
Posted
技术标签:
【中文标题】在 ASP.NET 中清除会话【英文标题】:Clearing a session in ASP.NET 【发布时间】:2012-10-03 10:22:46 【问题描述】:我是一名新开发人员,我的任务是找出为什么我们的注销功能不起作用。我已经尝试了我能找到的所有可能的方法。以下是我保留的日志,其中包括我使用过的方法。
在 CommonHeader.ascx 表单中添加了一个注销按钮
在 logout.aspx.vb 表单中尝试了多种方法以使其结束或清除会话,但均无济于事。
一个。以 logout.aspx.vb 形式定义的 ClearSession 子例程:
Session("Variable") = ""
FormsAuthentication.SignOut()
Session.RemoveAll()
Session.Abandon()
Session.Clear()
b.还将它添加到 Page_Load 子例程的顶部:
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)
HttpContext.Current.Response.Cache.SetNoServerCaching()
HttpContext.Current.Response.Cache.SetNoStore()
c。还将 ClearSession 子例程从 Session("Variable") = ""
更改为 Session.Contents.Remove("Variable")
这些方法都不起作用。我们使用 Siteminder,我一直想知道这是否是问题的根源。我只是在清除使用 Siteminder 的会话时找不到任何东西。另请注意,此应用程序是使用 Visual Studio 2003 编码的。
这是我在 ascx 文件中使用的按钮的代码:
athp:TopNavText Title="注销" NavigateUrl="logout.aspx" Target="_top"/
然后在“logout.aspx”表单上,我尝试使用上述方法之一或每种方法的组合。这是我接触之前的代码:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ClearSession()
Response.Redirect("login.aspx")
End Sub
Public Sub ClearSession()
Session("Variable") = ""
End Sub
【问题讨论】:
您是否通过调试确认您的 ClearSession 子例程已被调用? (特别是当你在那里有 Session.Abandon() 时) 如果您使用的是 VS2003,那么您使用的是 .NET 1.1。 是的,它肯定击中了子程序。我在代码中放置了标记,以验证它在到达 ClearSession 子例程之前没有停止。它只是在页面加载时调用,然后它应该重定向到登录页面,但是当我没有引用 Response.Redirect("login.aspx") 时,它一直将我重定向回主页,而我仍然登录。跨度> @JohnSaunders: 抱歉标签不好... vs 2003 已经很久了,我暂时忘记了版本... 您是否尝试过在 session_start 中放置一个断点以查看它是否再次被击中并重新初始化所有内容?我已经看到这是一个问题。 【参考方案1】:终于找到了解决方案,我最初并没有在删除包含站点管理器会话 ID 的 cookie 时定义域。我使用的代码如下:
Dim cookie3 As HttpCookie = New HttpCookie("SMSESSION", "NO")
cookie3.Expires = DateTime.Now.AddYears(-1)
cookie3.Domain = ".domain.com"
Response.Cookies.Add(cookie3)
Response.Redirect("login.aspx")
【讨论】:
【参考方案2】:这个问题:formsauthentication-signout-does-not-log-the-user-out 描述了一个即使在调用 FormsAuthentication.SignOut() 后也不清除 cookie 的问题。这听起来像是您的问题,他们说这是 .NET 的一个错误,而您使用 1.1 这听起来很可能。
【讨论】:
使用该示例会出现此错误:编译器错误消息:BC30108:'HttpCookie' 是一种类型,不能用作表达式。第 36 行:HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "") 好的,我修复了编译器错误,但使用该示例仍然无法正常工作。【参考方案3】:HI 朋友,请在用户控件中添加按钮的点击事件。在点击事件中,请添加以下代码并删除所有其他代码。
Session("变量") = "";
【讨论】:
【参考方案4】:看这篇文章
C# Clear Session
无论是升c还是vb,同样的规则仍然适用。您正在调用会话放弃然后清除,但是到您调用清除时会话应该已经消失了。
Clear 将会话状态与其中的对象一起保存,因此通过在放弃后调用它实际上可以为用户重新初始化会话,但变量已清除。
请参阅此帖子以了解终止会话并重定向到登录页面(如果有)的顺序和正确方法
FormsAuthentication.SignOut() does not log the user out
【讨论】:
【参考方案5】:首先要注意的是,如果你使用Forms Authentication,Session与用户是否登录完全无关。
如果 CookiesSupported 为 false,则调用 FormsAuthentication.SignOut 将从 cookie 或 URL 中删除表单身份验证票信息。
但它不会影响 Session 中存储的内容。
更新
为什么您认为注销 (FormsAuthentication.SignOut) 不起作用?当您点击退出时,您期望会发生什么?实际发生了什么?
我会删除所有代码以清除 Session 并查看此内容。例如,使用Fiddler 之类的工具查看http 流量:您应该能够看到当您单击注销时FormsAUthentication cookie 已被删除。
【讨论】:
感谢您澄清这一点。我只是想我会尝试一下,因为此时我只想让它发挥作用。我们正在使用命名空间 System.Web.SessionState,我认为它可以使用我上面尝试过的一些方法。 当我点击注销时,我试图让它将我重定向到我的登录页面。相反,它只是将我重定向回我的主页。我已经尝试了上面列出的每一种方法,根据 Fiddler 的说法,对于每一种方法,它仍然使用相同的 cookie。我相信它与 Siteminder 有关,但我不知道如何终止 Siteminder 会话 @GarrettBills,几乎可以肯定它与 SiteMinder 有关。我对 SiteMinder 不熟悉,所以我在您的问题中添加了一个 SiteMinder 标签,希望有人会看到它。我假设您需要使 SiteMinder 使用的任何 cookie 过期(通常通过将其过期日期设置为过去的日期) - 您应该能够使用 Fiddler 看到 cookie。 是的,我可以在 Fiddler 中看到 cookie 中有一个 ASP.NET_SessionId 和一个 SMSESSION。我已经能够杀死 ASP.NET_SessionId 变量,但是由于 SMSESSION 变量仍然存在,它只是创建了一个新的 cookie。我的同事说有代码可以杀死 SMSESSION,他今天会帮我弄清楚。一旦我们让它工作,我会发布它 您不需要杀死 ASP.NET SessionId cookie - 这与身份验证无关。您确实需要按照以下链接中的说明删除 SMSESSION cookie:msdn.microsoft.com/en-us/library/ms178195(v=vs.100).aspx以上是关于在 ASP.NET 中清除会话的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET 中的 Session.Clear() 和 Session.Abandon() 之后会话变量未清除
调用 Abandon() 后 ASP.net MVC 5 会话未清除