2009-05-13 42 views
10

Tôi đang đặt dữ liệu người dùng trong phiên rồi chuyển dữ liệu đó sang chế độ xem để xem trên trang. Bây giờ khi người dùng của tôi rời khỏi máy tính của anh ấy một thời gian, phiên kết thúc và dữ liệu anh ấy đã nhập bị mất (điều đó là ok) Vấn đề là khi anh ấy trả lại, anh ấy làm mới màn hình trang của tôi vẫn hiển thị nhưng tất cả dữ liệu Không còn. Vì vậy,Kết thúc phiên trong ASP.net MVC

Làm cách nào để chuyển hướng người dùng đến màn hình đăng nhập khi phiên hết hạn (vì vậy anh ấy không thấy trang trống) hoặc tôi muốn chuyển hướng anh ấy đến trang có nội dung "Bạn đã đăng xuất do không hoạt động ".

Cảm ơn

Trả lời

15

tôi sử dụng một số Javascript trong MasterPage của tôi để chuyển hướng người dùng (sau khi một dấu nhắc để làm mới phiên) với hành động logout. Nó sử dụng một yêu cầu AJAX trở lại trang chủ của ứng dụng để làm mới cửa sổ phiên phía máy chủ khi người dùng nhấp vào nút trong hộp thoại để mở rộng phiên. Phụ thuộc vào jQuery và jQuery UI cho hộp thoại.

<% 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

Phiên có thể trong Global.asax được sử dụng để làm điều này không? –

+0

Tôi không thấy cách bạn sẽ chuyển hướng trình duyệt đến một trang khác từ sự kiện Session_End trừ khi trình duyệt được kiểm tra định kỳ để xem phiên đó có còn hoạt động hay không. Thật không may, có trình duyệt làm điều này sẽ giả tạo giữ cho phiên còn sống vì nó sẽ được cập nhật trên mọi truy vấn. Tôi đang làm việc để biến điều này thành một plugin jQuery. – tvanfosson

+0

Sửa lỗi nếu tôi sai nhưng Session_End chạy trong chuỗi nền và vì vậy không thể giao tiếp với người dùng. yêu thích công việc của bạn tvanfosson, cách tiếp cận của bạn hoạt động rất tốt – CodeKiwi

6

Tôi giả sử bạn đang chứng thực người dùng một cách nào đó, nhưng bạn đang sử dụng Forms Authentication ?:

ASP.Net MVC Framework - Using Forms Authentication

Nếu bạn đã sử dụng Forms Authentication, bạn cần phải đảm bảo rằng thời gian hết hạn cookie xác thực chỉ ngắn hơn một chút so với thời gian chờ của phiên.

+0

Vâng, tôi đang sử dụng dự án MVC mặc định làm cơ sở của tôi. –

+0

YUK! Tôi ghét khi các trang web đăng xuất tôi mọi lúc. Hãy suy nghĩ cẩn thận trước khi thực hiện điều này hay không. Bản chất của trang web của bạn sẽ là yếu tố quyết định tất nhiên :) –

0

Dữ liệu có thể vẫn còn trên trang vì trình duyệt đang lưu vào bộ nhớ cache.

Cố gắng ném trong này và xem nếu dữ liệu vẫn còn đó sau khi phiên giao dịch là chết:

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

Tôi đã có vấn đề tương tự với một ứng dụng ASP.net cũ. Phiên hết hạn nhưng người dùng vẫn được xác thực vì cookie phiên và xác thực khác nhau và không nhất thiết phải hết hạn cùng một lúc. Những gì tôi đã làm sau đó đã sử dụng session.Start global.asax để kiểm tra xem người dùng đã được xác thực và đăng xuất anh ta chưa.

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

Điều này buộc người dùng bắt đầu phiên để đăng nhập lại. Bạn cũng có thể sử dụng sự kiện này để khôi phục thông tin phiên từ cơ sở dữ liệu hoặc có thể chuyển hướng anh ta đến một trang khác nhưng vẫn giữ thông tin đăng nhập của mình hợp lệ.

+0

Phiên có timeout một chức năng của máy chủ web không? (IIS6) Nó chỉ có thể được thay đổi từ đó trong bảng điều khiển? –

+0

Tôi đã thử mã này, nó đã đăng xuất tôi nhưng Response.Redirect không đưa tôi đến trang của tôi. –

+0

Bạn có thể thay đổi hết hạn phiên trên web.config hoặc lập trình sử dụng Phiên.Timeout = x; nếu bạn đăng xuất, bạn chỉ có thể truy cập trang đăng nhập hoặc trang không được bảo vệ bằng Xác thực. –

Các vấn đề liên quan