2011-06-30 7 views
3

セッションタイムアウトが頻繁に発生する問題があります。私は、各コントローラに使用することができ、共通のフィルターを書きたいMVC 3でセッションタイムアウトを処理する方法

、フィルタは、ユーザーが最後にリクエストを送信し、そこからの奥にログインし、ログイン後にするユーザーをリダイレクトする必要があります。あなたはこのような何かを試みることができる

+1

ボイラープレートのVisual Studio MVCアプリケーションがこれを行います。私はそれを見てみることをお勧めします。ダビッドに感謝します。 –

+1

私はそれを見つけることができませんでした。ありがとうございました – vivek

+0

あなたの質問を編集して、それ以上のことを行い、関連するタグを使用しました。 – jgauffin

答えて

5

public class SessionExpireAttribute : ActionFilterAttribute { 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { 
     base.OnActionExecuted(filterContext); 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) { 
     if (filterContext.HttpContext.Session != null) { 
      if (filterContext.HttpContext.Session.IsNewSession) { 
       var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"]; 
       if ((sessionCookie != null) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) { 
        // redirect to login 
       } 
      } 
     } 
    } 
} 
+1

+1。リクエストがajaxであるかどうかを確認し、コンテンツタイプ '' text/javascript ''と' 'document.location =' redirecturi '" 'に対するレスポンスボディを設定することができます。 – jgauffin

+0

@jgauffin私はmvcで新しいですので、 "document.location = 'redirecturi"のサンプルコードを提供できますか? –

0

は、既存の認可フィルタを試したことがありますか?

+0

認可フィルタはセッションタイムアウトとは関係ありません。 –

0

前述したように...この

public class SessionExpireAttribute : ActionFilterAttribute { 

    public override void OnActionExecuting(ActionExecutingContext filterContext) { 
     if (filterContext.HttpContext.Session != null) { 
      if (filterContext.HttpContext.Session.IsNewSession) { 
       filterContext.Result = new RedirectResult("/");//redirect to home page 
      } 
     } 
    } 
} 

を試した後、目を満たしているよりも、ここで多くのがありますアクションやコントローラ[SessionExpire]

1

の上にこのフィルタを適用します。ここでは、すでに説明したのと同じ概念を使用していますが、もう少し追加する、より完全なOnActionExecutingがあります。詳細については、インラインコメントを参照してください。呼び出される "InitializeSession"は、サイトを実行するためにSession Stateに必要な基本属性を作成するカスタム関数です。 「AlertWarning」は警告を表示するヘルパールーチンです。それ以外のものはすべて定型コードです。

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var bRequiresAuthorization = 
    (filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0) || 
    (filterContext.Controller.GetType().GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0); 

    if (filterContext.HttpContext.Session != null) 
    { 
    if (filterContext.HttpContext.Session.IsNewSession) 
    { 
     //New session. Initialize Session State 
     bool b = InitializeSession(null); 

     if (bRequiresAuthorization) 
     { 
     //Action requested requires authorized access. User needs to authenticate this 
     //new session first, so redirect to login 
     string cookie = filterContext.HttpContext.Request.Headers["Cookie"]; 
     if ((cookie != null) && (cookie.IndexOf("_SessionId=") >= 0)) 
     { 
      //An expired session cookie still resides on this PC, so first alert user that session is expired 
      AlertWarning("Session timed out due to inactivity. Please log in again."); 
     } 
     filterContext.Result = RedirectToAction("LogOut", "Authentication"); 
     } 
    } 
    } 

    base.OnActionExecuting(filterContext); 

} 
関連する問題