2009-05-13 16 views
10

セッションにユーザーデータを配置して、ビューデータに渡してページを表示します。私のユーザーがコンピュータからしばらく離れると、セッションが終了し、入力したデータは失われます(これは問題ありません)。問題は、彼が戻ったときに画面を更新してもページは表示されますが、行った。したがって、セッション終了のASP.net MVC

セッションが期限切れになったとき(つまり、空白のページが表示されないため)、ユーザーをログイン画面にリダイレクトすることができます。または、「あなたが非アクティブのためにログアウトしました」というページにリダイレクトしたいのですが"

おかげ

答えて

15

私はログアウトアクションに(プロンプトの後にセッションを更新する)ユーザーをリダイレクトするために、私のマスターページにいくつかのJavascriptを使用しています。ユーザーがダイアログのボタンをクリックしてセッションを延長すると、AJAXリクエストがアプリケーションのホームページに戻ってサーバー側のセッションウィンドウが更新されます。ダイアログのjQueryとjQuery UIに依存します。

<% if (this.Request.IsAuthenticated) 
    { 
     int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1.5 minutes 
     int sessionTimeout = 28 * 60 * 1000; // ms = 28 minutes 
     if (ViewData["sessionTimeout"] != null) 
     { 
      sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000; 
     } 
%> 
<script type="text/javascript"> 
    var logoutTimer = null; 
    var sessionTimer = null; 
    var sessionTimeout = Number('<%= sessionTimeout %>'); 
    var sessionDialogWait = Number('<%= sessionDialogWait %>'); 

    $(document).ready(function() { 
     $('#sessionEndDialog').dialog({ 
      autoOpen: false, 
      bgiframe: true, 
      modal: true, 
      buttons: { 
       OK: function() { 
        $(this).dialog('close'); 
        $.get('<%= Url.Action("About", "Home") %>', scheduleSessionPrompt, 'html'); 
       }, 
       Logout: logoutOnSessionExpires 
      } 
     }).ajaxStart(function() { scheduleSessionPrompt(); }); 
     scheduleSessionPrompt(); 
    }); 

    function scheduleSessionPrompt() 
    { 
     if (logoutTimer) clearTimeout(logoutTimer); 
     if (sessionTimer) clearTimeout(sessionTimer); 

     sessionTimer = setTimeout(sessionExpiring, sessionTimeout ); 
    } 

    function sessionExpiring() 
    { 
     logoutTimer = setTimeout(logoutOnSessionExpires, sessionDialogWait); 
     $('#sessionEndDialog').dialog('open'); 
    } 

    function logoutOnSessionExpires() 
    { 
     window.location.href = '<%= Url.Action("Logout", "Account") %>'; 
    }  

    </script> 
<% } %> 

<div id="sessionEndDialog" title="Session Expiring" style="display: none;"> 
    <p>Your session is about to expire. Click OK to renew your session or Logout to logout of the application.</p> 
</div> 
+0

これにGlobal.asaxのSession_Endを使用できますか? –

+0

ブラウザがセッションが生きているかどうか定期的にチェックしていない限り、ブラウザをSession_Endイベントから別のページにリダイレクトする方法はわかりません。残念ながら、ブラウザを使用すると、セッションごとにクエリが更新されるため、人為的にセッションが維持されます。私はこれをjQueryプラグインに変換しようとしています。 – tvanfosson

+0

私が間違っているが、Session_Endがバックグラウンドスレッドで実行されているため、ユーザーと通信できない場合は、私を修正してください。 あなたの仕事が大好きです、あなたのアプローチは非常にうまく動作します – CodeKiwi

6

私はあなたには、いくつかの方法でユーザーを認証していると仮定していますが、あなたはフォーム認証を使用している?:

ASP.Net MVC Framework - Using Forms Authentication

あなたはすでにあなたがする必要がある、フォーム認証を使用している場合認証Cookieの有効期限がSessionのタイムアウトより少し短くなっていることを確認してください。

+0

はい、私はベースとしてデフォルトのMVCプロジェクトを使用しています。 –

+0

YUK!私はサイトがいつも私をログアウトするのが嫌いです。これを実装する前に慎重に考えてください。あなたのサイトの性質はもちろん決め手になります:) –

0

ブラウザがキャッシュしているため、データがページに残っている可能性があります。

はでこれを投げてみて、セッションが死んだ後、データがまだそこにあるかどうかを確認:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
5

私は古いASP.netアプリで同じ問題を抱えていました。セッションは終了しますが、セッションCookieと認証Cookieが異なるため、ユーザーがまだ認証されているとは限りません。 私がしたことは、ユーザーが認証されてログアウトしたかどうかを確認するためにglobal.asax Session_Startを使用することでした。

protected void Session_Start(Object sender, EventArgs e) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect("~/SessionEnd.aspx"); 
     } 
    } 

これは、ユーザーがセッションを開始し直すように強制します。また、このイベントを使用してデータベースからセッション情報を回復するか、または彼を別のページにリダイレクトすることができますが、彼の資格は有効です。

+0

セッションタイムアウトはウェブサーバーの機能ですか? (IIS6)コントロールパネルからのみ変更できますか? –

+0

私はこのコードを試しました、それは私をログアウトしましたが、Response.Redirectは私のページに私を連れて行っていませんでした。 –

+0

web.config でSessionの有効期限を変更するか、Sessionを使用してプログラムで有効期限を変更できます。タイムアウト= x; ログアウトすると、ログインページまたは認証によって保護されていないページにしかアクセスできません。 –

関連する問題