1

セッションをクリアし、セッション タイムアウトでユーザーをサインアウトして、ログイン ページにリダイレクトしようとしています。ログイン ページは、アカウント コントローラーのログオン メソッドによって返される部分的なビューです。セッションがタイムアウトすると、ログイン ビューは、セッションがタイムアウトする前にユーザーが表示していた現在のページにレンダリングされ、URL と同じことがレンダリングされます。

Web.Config

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

BaseController.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 に答える