2011-08-17 34 views
13

Tôi đang sử dụng ASP.NET MVC. Tôi muốn chuyển hướng đến trang đăng nhập khi phiên hết hạn. Làm thế nào tôi có thể đạt được điều này? Nếu tôi đang thực hiện một cuộc gọi AJAX đến một phương thức trong bộ điều khiển thì nếu phiên của tôi hết hạn trong tình huống đó thì tôi cũng muốn chuyển hướng đến trang đăng nhập.Với chuyển hướng ASP.NET MVC đến trang đăng nhập khi phiên hết hạn

Trả lời

15

bạn có thể làm điều này bằng 3 cách:

  1. Tạo bộ lọc để hành động của bạn và áp dụng nó lập trình một mã trong OnActionExecuting (trước khi hành động được thực hiện), http://www.asp.net/mvc/tutorials/understanding-action-filters-cs

  2. Tạo cơ sở class (kế thừa từ lớp Controller) và làm cho bộ điều khiển của bạn kế thừa từ cái này. Trong lớp này, bạn có thể ghi đè lên một phương thức gọi là OnActionExecuting, giống như bộ lọc.

  3. Không sử dụng phiên cho xác thực, bạn có thể sử dụng hình thức xác thực và giữ cho nó đơn giản để sử dụng, xem xét điều này: http://weblogs.asp.net/fredriknormen/archive/2008/02/07/asp-net-mvc-framework-using-forms-authentication.aspx

Theo tôi, giải pháp 3 là tốt hơn so với khác. Tôi hy vọng nó làm việc cho bạn!

+6

Giải pháp 3 là sai. Sử dụng xác thực biểu mẫu, người dùng vẫn có thể được xác thực thông qua cookie nhưng có phiên mới. Nếu bộ điều khiển của bạn không bắt được điều này thì bạn có thể có ngoại lệ cố gắng truy cập đối tượng Session mà chưa được cấu hình bởi trang đăng nhập. –

+0

Giải pháp 1 về mặt kỹ thuật là không chính xác. Mặc dù một bộ lọc, một sử dụng bắt nguồn từ 'AuthorizeAttribute' và' IAuthorizationFilter' và sau đó ghi đè lên 'OnAuthorization' và/hoặc' AuthorizeCore' tùy thuộc vào tình huống. Đây là trường hợp tất cả các cách quay trở lại MVC 2. –

+0

@ErikPhilips, bạn có thể vui lòng đề xuất một liên kết/ví dụ để làm rõ thêm. Cảm ơn. –

7

vì có thể sao chép cookie bảo mật của Xác thực biểu mẫu sử dụng nó để mô phỏng người dùng đã đăng ký Tôi sử dụng thuộc tính sau để ràng buộc xác thực cho phiên hiện tại.

Để làm cho Thuộc tính hoạt động, bạn phải đặt phiên ["người dùng"] = MyUser khi đăng nhập và gọi session.abandom() khi đăng xuất. Tôi không biết liệu chuyển hướng có hoạt động với cuộc gọi ajax hay không - đó là điều bạn phải thử.

[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

Chuyển hướng dường như không hoạt động đối với tôi. Tôi có một trang web di động MVC dường như có nghĩa là mọi thứ đều sử dụng AJAX. Bạn không chắc chắn cách bạn chuyển hướng hoạt động. –

+0

nếu tôi áp dụng thuộc tính này cho một lớp, làm thế nào tôi có thể viết một thuộc tính nghịch đảo để áp dụng nó vào hành động? Bỏ chọnUserSessionAttribute ví dụ – Wachburn

+0

Tôi nghĩ rằng điều này không được hỗ trợ bởi khung MVC. Theo như tôi biết nó sẽ đánh giá tất cả các thuộc tính lọc. Tôi không thể tưởng tượng một cách để giải quyết vấn đề của bạn. Vì vậy, bạn phải áp dụng nó cho mọi phương pháp trong lớp học của bạn. – Michael

3

này trả lời là chủ yếu dựa vào Michaels trừ nó hoạt động ;-)

tôi đã thay đổi nó để có một đại biểu để kiểm tra xem phiên đã kết thúc sao cho phiên có thể hoạt động trong các ứng dụng khác nhau có thể có các cách khác nhau để xác định điều này và trang đăng nhập có thể khác trong các ứng dụng khác. Trong Global.asax.cs Application_Start() mã tôi có trong ứng dụng của tôi là

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

Sau đó, lớp thuộc tính như sau

[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(); 

     } 
    } 

Từ điều khiển của bạn chỉ cần thêm [CheckUserSession] thuộc tính trên lớp hoặc các hành động riêng lẻ.

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