2011-08-17 8 views
13

私はASP.NET MVCを使用しています。セッションが終了するとログインページにリダイレクトしたいどうすればこれを達成できますか?コントローラのメソッドへのAJAX呼び出しを行っている場合、セッションがその状況で期限切れになった場合でも、ログインページにリダイレクトします。あなたは3つの方法でこれを行うことができますASP.NET MVCを使用すると、セッションが終了するとログインページにリダイレクトされます

答えて

15

  1. は、ベースを作成し、あなたのアクションにフィルタを作成し、(アクションが実行されて前に)OnActionExecutingのコードをプログラミングすることを適用し、http://www.asp.net/mvc/tutorials/understanding-action-filters-cs

  2. クラス(Controllerクラスから継承)を作成し、コントローラを継承させます。このクラスでは、フィルタのようにOnActionExecutingというメソッドを上書きできます。

  3. はこの見て、あなたが使用するフォーム認証を使用し、それをシンプルに保つことができ、認証のためのセッションを使用しないでください。私の意見ではhttp://weblogs.asp.net/fredriknormen/archive/2008/02/07/asp-net-mvc-framework-using-forms-authentication.aspx

を、溶液3は、他よりも優れています。私はそれがあなたのために働くことを望む!

+6

解決策3が間違っています。フォーム認証を使用すると、ユーザーはCookieを使用して認証できますが、まったく新しいセッションができます。コントローラがこれをキャッチしないと、ログインページで設定されていないセッションオブジェクトにアクセスしようとすると例外が発生する可能性があります。 –

+0

解決策1は技術的に正しくありません。フィルタは、「AuthorizeAttribute」および「IAuthorizationFilter」から派生し、状況に応じて、OnAuthorizationおよび/またはAuthorizeCoreをオーバーライドします。これは、MVC 2に戻るすべてのケースです。 –

+0

@ErikPhilips、さらに明確にするためのリンク/例をお勧めしますか?ありがとう。 –

7

フォーム認証のセキュリティクッキーをコピーして登録ユーザーをシミュレートできるので、次の属性を使用して認証を現在のセッションの有効期間にバインドします。

属性を動作させるには、ログイン時にsession ["user"] = MyUserを設定し、ログアウト時にsession.abandom()を呼び出す必要があります。 リダイレクトがajaxコールで動作するかどうかはわかりません。これは試してみるべきことです。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class CheckUserSessionAttribute : ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpSessionStateBase session = filterContext.HttpContext.Session; 
     var user = session["User"]; 

     if (((user == null) && (!session.IsNewSession)) || (session.IsNewSession)) 
     { 
      //send them off to the login page 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content("~/Account/LogOff"); 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 
      filterContext.HttpContext.Response.Redirect(loginUrl, true); 
     } 
    } 
} 
+0

リダイレクトが私にとってうまくいかないようです。私はすべてがAJAXを使用しているように見えるMVCモバイルサイトを持っています。リダイレクトをどのように機能させるかは不明です。 –

+0

この属性をクラスに適用すると、それをアクションに適用するためにどのようにinvert属性を記述できますか? UncheckUserSessionAttribute(例: – Wachburn

+0

)これはMVCフレームワークでサポートされていないと思います。私が知る限り、すべてのフィルタ属性を評価します。私はあなたの問題を解決する方法を想像することはできません。だからクラスのすべてのメソッドに適用する必要があります。 – Michael

3

この回答は重くマイケルズに基づいていますセッションが終了したかどうかを確認するデリゲート。異なるアプリで動作する可能性があります。さまざまな方法があり、ログインページも他のアプリとは異なる場合があります。 Global.asax.csのApplication_Start()で私のアプリでは、私が持っているコードは、ちょうど[CheckUserSession】上記の属性を追加するには、コントローラから

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
    public class CheckUserSessionAttribute : ActionFilterAttribute 
    { 
     public static String LoginUrl { get; set; } 
     public delegate bool CheckSessionDelegate(HttpSessionStateBase session); 

     public static CheckSessionDelegate CheckSessionAlive; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 

      HttpSessionStateBase session = filterContext.HttpContext.Session; 
      if ((CheckSessionAlive == null) || (CheckSessionAlive(session))) 
        return; 


      //send them off to the login page 
      var url = new UrlHelper(filterContext.RequestContext); 
      var loginUrl = url.Content(LoginUrl); 
      session.RemoveAll(); 
      session.Clear(); 
      session.Abandon(); 

      filterContext.HttpContext.Response.StatusCode = 403; 
      filterContext.HttpContext.Response.Redirect(loginUrl, false); 
      filterContext.Result = new EmptyResult(); 

     } 
    } 

を次のように

CheckUserSessionAttribute.CheckSessionAlive = session => (session.GetUser() != null); 
CheckUserSessionAttribute.LoginUrl = "~/Account/Login"; 

が次に属性クラスがありますクラスまたは個々のアクション。

関連する問題