1

我正在尝试清除会话并在会话超时时将用户注销并重定向到登录页面。登录页面是由帐户控制器中的登录方法返回的部分视图。当会话超时时,登录视图会呈现在用户在会话超时之前所在的当前页面中,并且与 URL 相同。

网络配置

<configuration>
    <system.web>
        <authentication mode="Forms">
             <forms loginUrl="~/Account/LogOn" timeout="2880" />
             <sessionState timeout="45"></sessionState>
        </authentication>
    </system.web>
</configuration>

基本控制器.cs

protected override void OnActionExecuting( ActionExecutingContext filterContext )
{
    HttpContext ctx = HttpContext.Current;

    if(ctx.Request.IsAuthenticated)
    {
        if (ctx.Session != null)
        {
            if (ctx.Session.IsNewSession)
            {
                string sessionCookie = ctx.Request.Headers["Cookie"];
                if (null != sessionCookie)
                {
                   Session.Clear();
                   FormsAuthentication.SignOut();
                   var rr = new RedirectResult(loginUrl);
                   filterContext.Result = rr;
                }
            }
        }
    }

    base.OnActionExecuting ( filterContext );
}

我知道我需要从客户端进行重定向,但我不想添加另一个会话计时器。当会话超时时,无论如何要从服务器进行“真实”重定向?

我想要的是当会话超时时,服务器应该清除当前会话,注销用户并显示登录视图,而不是在当前页面上呈现登录视图。

有小费吗?

4

1 回答 1

3

您正在使用局部视图。创建一个呈现登录部分视图的新视图“LoginView.cshtml”。你可以检查用户是否仍然登录Session_Start。如果他是,将他注销并重定向到新的登录视图。

  protected void Session_Start(Object sender, EventArgs e)
  {
     if (User.Identity.IsAuthenticated)
     {
        FormsAuthentication.SignOut();
        Response.Redirect("~/Account/LogOn");
     }
  }
于 2013-11-07T07:55:15.817 回答