使用MVC3注销后立即清除会话上下文的问题

时间:2011-09-13 07:47:54

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我在MVC3应用程序中遇到用户登录和注销问题。以下是我的用户控制器中的注销操作示例:

public ActionResult Logout()
{
    FormsService.SignOut();
    Session.Clear();
    return RedirectToAction("index", "home");
}

用户单击“注销”后,将调用此操作,它会清除会话信息,然后将用户重定向到索引页。

在我的索引页面上,我调用C#帮助程序来显示如下消息:

@section links { @Html.HdrLinks("Home", "", Context.User) }

以下是帮助程序代码的一部分:

System.Security.Principal.IPrincipal user

if (user.Identity.IsAuthenticated)
{
   return new MvcHtmlString("Welcome " + user.Identity.Name);
}

我的问题是,当注销后立即显示索引页面时,它仍会显示相同的会话信息。换句话说,它仍然显示像“欢迎约翰”这样的消息。仅在我在浏览器中刷新页面后,才能正确地看到会话中未设置用户名。

有没有人对我能做什么有任何想法,以便在注销和重定向之后,索引页面仍然不认为用户已登录?例如,除了RedirecToAction之外,还有一些我可以执行的调用可以帮助我。

更新:

似乎当我将代码更改为以下内容时,它会执行我想要的操作,当它显示索引页面时,它不会显示我仍然登录。但是我不知道为什么会这样做

FormsService.SignOut();
Session.Clear();
Session.Abandon();
return new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Index" }));

2 个答案:

答案 0 :(得分:0)

这可能是缓存问题。您是否检查过当您的代码要求浏览器进行重定向时,浏览器是否真的向索引页面发出新请求?只需在索引操作中设置断点,然后查看Session属性。

答案 1 :(得分:0)

以下是另一篇文章的Link,其中详细介绍了您需要做的两件事

  1. 您需要清除会话,验证Cookie和会话Cookie,并在回复中返回Cookie。

  2. 您需要在客户端上使缓存失效,以便用户无法通过点击浏览器的后退按钮访问缓存页面。

  3. 有关详细信息,请参阅Link