C# 使用asp.net中的会话从帐户注销时出现问题

C# 使用asp.net中的会话从帐户注销时出现问题,c#,asp.net,visual-studio-2010,session,logout,C#,Asp.net,Visual Studio 2010,Session,Logout,我的asp.net中的会话管理有问题。我正在注销管理员和用户帐户,但当我按下浏览器的前进按钮时,页面将再次重定向到用户/管理员帐户。每次单击“注销”按钮时,我已经销毁了为存储用户名而创建的会话 在您拥有的每个页面中,您应该在页面加载中实现一个小if语句,检查会话是否为空,如下所示: if(Session["User"] == null) Response.Redirect("~/Login.aspx"); 请确保注销时会话设置为空。如果您使用的是Visual Studio的默认模板,这

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

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

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

请确保注销时会话设置为空。

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

if(!HttpContext.Current.User.Identity.IsAuthenticated)
{
    Response.Redirect("~/Login.aspx");
}

这里可能有两个问题:

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

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

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

  • 第二个问题(客户端):

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

    然后,如果用户已注销,ASP.NET的
    授权
    |
    身份验证
    部分将优雅地将您重定向到
    登录.aspx
    页面


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

    您在“Backbutton”刷新方面遇到了问题,我猜听起来用户可能通过客户端cookie再次获得身份验证。如果您清除浏览器缓存,这会消失吗?您的应用程序是否有可能使用SSO?或者将其添加到母版页,或者创建自定义基本页并在加载时添加代码。但是,这样想,如果页面是从浏览器缓存加载的呢?
     Response.Buffer=true;
     Response.ExpiresAbsolute=DateTime.Now.AddDays(-1d);
     Response.Expires =-1500;
     Response.CacheControl = "no-cache";