使用 asp.net 中的会话从帐户注销时遇到问题

Posted

技术标签:

【中文标题】使用 asp.net 中的会话从帐户注销时遇到问题【英文标题】:Having problems in logging out from the account using sessions in asp.net 【发布时间】:2013-12-17 08:55:30 【问题描述】:

我的 asp.net 中的会话管理出现问题。我正在注销管理员和用户帐户,但是当我按下浏览器的前进按钮时,页面再次重定向到用户/管理员帐户。每次单击注销按钮时,我都已经销毁了为存储用户名而创建的会话。

【问题讨论】:

我猜你的“后退按钮”刷新有问题 听起来用户可能正在通过客户端 cookie 再次进行身份验证。如果清除浏览器缓存,这种情况会消失吗? 您的应用是否有可能使用 SSO? 【参考方案1】:

在您拥有的每个页面中,您应该在 Page_Load 中实现一个小的 if 语句,以检查 Session 是否为空,如下所示:

if(Session["User"] == null)
    Response.Redirect("~/Login.aspx");

确保在您注销时,确保将 Session 设置为 null。

【讨论】:

或将其添加到 Masterpage 或创建自定义基本页面并在加载时添加该代码 但是,这样想,如果页面是从浏览器缓存中加载的呢?【参考方案2】:

如果您使用的是 Visual Studio 的默认模板,这可能会对您有所帮助:

if(!HttpContext.Current.User.Identity.IsAuthenticated)

    Response.Redirect("~/Login.aspx");

【讨论】:

【参考方案3】:

这里可能有两个问题:

第一个问题(服务器端):

    使用Session 存储身份验证和授权是设计应用程序的一种糟糕方式。使用 ASP.NET 授权和身份验证 (FormsAuthentication) 框架来执行此操作。这样,您的应用程序可以使用客户端 cookie 来存储身份验证信息,并且可以只允许某些用户访问您的应用程序中的某些页面(使用授权)。

    Session 每次 ASP.NET 回收应用程序池时都会丢失数据(这可能是随机发生的)。这有潜在的危险,可能会在使用过程中导致NullReferenceExceptions。(如果会话管理是默认的inproc,则会发生这种情况)

第二个问题(客户端):

通常浏览器会缓存页面,所以Page_Load不会在服务器端执行。要解决此问题,您可以在每个页面上的Page_Load 事件中添加此代码(或将其添加到母版页):

 Response.Buffer=true;
 Response.ExpiresAbsolute=DateTime.Now.AddDays(-1d);
 Response.Expires =-1500;
 Response.CacheControl = "no-cache";

然后,如果用户已注销,ASP.NET 的Authorization|Authentication 部分将优雅地将您重定向到Login.aspx 页面。

使用更多代码,您甚至可以重定向到特定用户的主页,如果该用户已经基于某个角色 ID 进行了身份验证。

【讨论】:

以上是关于使用 asp.net 中的会话从帐户注销时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在asp.net中真正注销

如何注销单个帐户?

用户在 ASP .NET MVC 5 中注销时如何清除所有会话元素?

如何在 OWIN ASP.NET MVC5 中注销用户

如何在asp.net中恢复会话

Asp.net:实现自动注销功能