使用 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 回收应用程序池时都会丢失数据(这可能是随机发生的)。这有潜在的危险,可能会在使用过程中导致NullReferenceException
s。(如果会话管理是默认的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 中的会话从帐户注销时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章