27

次のようなsessionTimeoutを実装しているASP.NETMVC4アプリケーションがあります。

<configuration>
  <system.web>
    <sessionState timeout="2"></sessionState>
  </system.web>
</configuration>

そして認証において:

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

セッションの有効期限が切れた後(2分)、ログオンページにリダイレクトする必要がありますが、リダイレクトが発生しません。

リダイレクトするようにコードを変更するにはどうすればよいですか?

4

3 に答える 3

33

1つの方法は、Session Expireの場合、すべてのアクションでそのセッションをチェックする必要があり、それがnullの場合は、ログインページにリダイレクトすることです。

しかし、これは非常に多忙なメソッドです。これを克服するには、これを実行 する独自のメソッドを作成する必要がありますActionFilterAttribute。すべてのアクションメソッドにこの属性を追加するだけです。

これは、ActionFilterAttributeをオーバーライドするクラスです。

public class SessionExpireFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;

            // check if session is supported
            CurrentCustomer objCurrentCustomer = new CurrentCustomer();
            objCurrentCustomer = ((CurrentCustomer)SessionStore.GetSessionValue(SessionStore.Customer));
            if (objCurrentCustomer == null)
            {
                // check if a new session id was generated
                filterContext.Result = new RedirectResult("~/Users/Login");
                return;
            }

            base.OnActionExecuting(filterContext);
        }
    }

次に、実際には次のようにこの属性を追加します。

[SessionExpire]
public ActionResult Index()
{
     return Index();
}

これでうまくいきます。

于 2012-12-14T07:03:34.040 に答える
31

セッションがMVCで終了したときに、ログインページをリダイレクトする非常に簡単な方法を発見しました。私はすでにそれをテストしました、そしてこれは問題なく動作します。

つまり、1分前に_Layoutでセッション終了をキャッチしてリダイレクトします。

私はすべてを段階的に説明しようとしています。

30分後にセッションを終了し、loginPageにリダイレクトする場合は、次の手順を参照してください。

  1. 次のようにWeb構成を変更します(31分に設定)。

     <system.web>
        <sessionState timeout="31"></sessionState>
     </system.web>
    
  2. このJavaScriptを追加します_Layout(このコードがリダイレクトされる1分前にセッションが終了すると、サイトへの最初のアクセスではなく、ユーザーの最後のアクションからカウント時間が作成されます)

    <script>
        //session end 
        var sessionTimeoutWarning = @Session.Timeout- 1;
    
        var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
        setTimeout('SessionEnd()', sTimeout);
    
        function SessionEnd() {
            window.location = "/Account/LogOff";
        }
    </script>
    
  3. これが私のLogOffアクションです。これは、LogOffとリダイレクトLoginInページのみを作成します。

    public ActionResult LogOff()
    {
        Session["User"] = null; //it's my session variable
        Session.Clear();
        Session.Abandon();
        FormsAuthentication.SignOut(); //you write this when you use FormsAuthentication
        return RedirectToAction("Login", "Account");
    } 
    

これがあなたにとって非常に役立つコードであることを願っています。

于 2015-09-16T12:30:30.303 に答える
6

一般的な解決策があります:

許可されたユーザーのコンテンツを配置するAdminという名前のコントローラーがあるとします。

次に、以下に説明するように、AdminコントローラーのInitializeorOnAuthorizationメソッドをオーバーライドし、セッションタイムアウト時にログインページロジックへのリダイレクトを書き込むことができます。

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
    {
        //lets say you set session value to a positive integer
        AdminLoginType = Convert.ToInt32(filterContext.HttpContext.Session["AdminLoginType"]);
        if (AdminLoginType == 0)
        {
            filterContext.HttpContext.Response.Redirect("~/login");
        }

        base.OnAuthorization(filterContext);
    }
于 2013-09-27T10:54:33.113 に答える