在 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 会话未清除

在 ASP.NET 中注销时如何杀死用户的会话

将 ASP.NET 会话传递给 jQuery

ASP.NET 应用程序转到 500.21 ...直到 IIS 重置 + 清除临时 ASP.NET 缓存

ASP.NET 中的会话超时